尝试在不创建新变量的情况下返回结果

时间:2017-02-12 04:14:44

标签: elixir

有没有办法简化这段代码:

keyup

我想避免创建var2并返回结果。

3 个答案:

答案 0 :(得分:5)

虽然Dogbert的回答是完全正确的,但我想展示一些可能用于完全消除中间局部变量的技巧。

模式匹配而不是if

def test do
    func1()
    |> func2()
    |> func3()
    |> fn
      nil -> nil
      var -> func4(var)
    end.() # ⇐ call the anonymous function inplace
    |> func5()
end

链接if

这种方法在这种情况下不起作用,因为func4要求链式变量作为​​参数传入,但通常情况下if也可能被链接:

def test do
    func1()
    |> func2()
    |> func3()
    |> if(do: nil, else: func4())
    |> func5()
end

上面有副作用,并不是== nil的100%相等,因为false也是falsey,但这个例子的优雅让我觉得值得一提

答案 1 :(得分:2)

您可以将if的返回值直接传递给func5

if var1 == nil do
  var1
else
  func4(var1)
end
|> func5()

答案 2 :(得分:1)

另一个惯用的解决方案是在函数参数上使用模式匹配。在func4(或func4的包装器)上执行此操作将避免任何中间变量:

def test do
    func1()
    |> func2()
    |> func3()
    |> func4()
    |> func5()
end

def func4(nil), do: nil
def func4(arg) do 
  # whatever you had in func4
end