如果params不是零,那么执行惯用药吗?

时间:2016-06-13 02:58:37

标签: elixir

如何在继续处理参数之前过滤掉无效参数如nil或空列表?

下面的 def load(token) do case token do nil -> nil [] -> nil token -> process(token) end end 使用似乎很常见,但代码不清楚 - 我很确定有一种更简单,更惯用的方法。

{{1}}

2 个答案:

答案 0 :(得分:8)

如果函数有多个子句,Elixir将尝试每个子句,直到找到匹配的子句。这允许你过滤"在提供的参数的基础上 - 如果函数没有共同的逻辑,则特别有用。

def load([]), do: IO.puts("empty")
def load(token) when token == nil, do: IO.puts("nil") # Matching `nil' is OK too.
def load(token), do: process(token)

第二个子句说明了使用允许更一般匹配的保护,有a number of predicates that are valid as guards所有这些都可以附加到(几乎)用于以递归或其他方式切换函数参数的任何表达式。

此约定适用于所有现有的BEAM语言,在阅读OTP文档时请记住这一点。

答案 1 :(得分:2)

我更喜欢

def load(nil), do: nil
def load([]), do: nil
def load(token), do: process(token)

你也可以这样做:

def load([]), do: nil
def load(token) when not is_nil(token), do: process(token)
def load(_), do: nil

但是我不会比较token == nil,因为你会收到编译器的警告。