Elixir 如果params不是nil,则执行惯用的长生不老药?
在继续处理参数之前,如何过滤掉无效的参数,如nil或空列表 下面的Elixir 如果params不是nil,则执行惯用的长生不老药?,elixir,Elixir,在继续处理参数之前,如何过滤掉无效的参数,如nil或空列表 下面的案例似乎很常见,但它不是清晰的代码——我非常确定有一种更简单、惯用的方法来实现这一点 def load(token) do case token do nil -> nil [] -> nil token -> process(token) end end 如果函数有多个子句,Elixir将尝试每个子句,直到找到一个匹配的子句。这允许您根据提供的参数进行“筛选”
案例
似乎很常见,但它不是清晰的代码——我非常确定有一种更简单、惯用的方法来实现这一点
def load(token) do
case token do
nil -> nil
[] -> nil
token -> process(token)
end
end
如果函数有多个子句,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)
第二个子句说明了保护的使用,它允许更一般的匹配,所有这些都可以附加到(几乎)任何用于递归或其他方式切换函数参数的表达式上
此约定适用于所有现有的BEAM语言,在阅读OTP文档时请牢记此约定。我更喜欢
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
,因为编译器会给你一个警告。好吧,这也很好,def load(nil),do:IO.puts(“nil”)
谢谢。我想你会得到一个警告,与nil比较是不安全的。我认为您需要使用is\u nil()