从版本1.3开始,有没有更好的方法用Elixir编写条件结构

时间:2016-06-22 15:22:41

标签: elixir

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

1 个答案:

答案 0 :(得分:3)

正如您所提到的,需要冗余以防止state超出范围。

让它“更清洁”只是编码偏好的问题。以下是我想到的两种解决方案:

  1. 三元表达
  2. state = if some_condition, do: modify_my_state(state), else: state

    1. 修改功能的模式匹配:
    2. 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