Elixir 1.3引入了命令式赋值的弃用,这意味着代码块类似于:
def modify(state) do
if some_condition do
state = modify_my_state(state)
end
# some other stuff may happen now here
state
end
由于state
超出范围,因此会在编译时产生警告。这是可以理解的。但建议的解决方案导致:
def modify(state) do
state = if some_condition do
modify_my_state(state)
else
state
end
# some other stuff may happen now here
state
end
我发现它有点多余。有没有其他方法可以让它更干净?请注意,以下解决方案打破了初始设计:
def modify(state) do
state = if some_condition do
modify_my_state(state)
end
# some other stuff may happen now here
state
end
答案 0 :(得分:3)
正如您所提到的,需要冗余以防止state
超出范围。
让它“更清洁”只是编码偏好的问题。以下是我想到的两种解决方案:
state = if some_condition, do: modify_my_state(state), else: state
state = modify_my_state(state, some_condition)
然后针对modify_my_state/2
进行模式匹配:
defp modify_my_state(state, true), do: modify_my_state(state)
defp modify_my_state(state, false), do: state