Elixir中如何通过管道操作符避免条件分支的代码重复?
消除Elixir函数中的重复逻辑
你提供的smallestNumber函数里,两个case分支重复执行了String.to_integer(Enum.join(...))的逻辑,要把公共逻辑抽到分支外,得调整管道的使用方式——Elixir的|>是将前一步结果作为后一步函数的第一个参数传入,所以正确的写法应该是先对分支返回的列表做拼接,再转成整数:
原代码
def smallestNumber(list) do [head | tail] = Enum.sort(list) case head === 0 do true -> [tempHead | tempTail] = tail String.to_integer(Enum.join([tempHead | [head | tempTail]], "")) false -> String.to_integer(Enum.join([head | tail], "")) end end
修正后的代码
def smallestNumber(list) do [head | tail] = Enum.sort(list) case head === 0 do true -> [tempHead | tempTail] = tail [tempHead | [head | tempTail]] false -> [head | tail] end |> Enum.join("") |> String.to_integer() end
说明
- 让case分支只返回处理好的数字列表:如果首元素是0,就把第一个非0元素移到最前面,后面跟0和剩余元素;否则直接返回排序后的列表。
- 用
|>把列表传给Enum.join(""),将列表拼接成字符串。 - 再把拼接好的字符串传给
String.to_integer(),转成整数。
这样就把重复的Enum.join和String.to_integer逻辑完全抽离到分支外,代码更简洁,也符合Elixir的管道使用习惯。
内容的提问来源于stack exchange,提问作者IOEnthusiast
相关产品推荐
相关产品推荐

