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

Teo*_*ing 11 elixir

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

case下面的用法似乎很常见,但代码并不清楚 - 我很确定有一种更简单和惯用的方法可以做到这一点.

 def load(token) do

   case token do
     nil -> nil
     [] -> nil
     token -> process(token)
   end

 end
Run Code Online (Sandbox Code Playgroud)

ŹV *_*V - 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)
Run Code Online (Sandbox Code Playgroud)

第二个子句说明了使用允许更一般匹配的保护,有许多谓词有效作为保护,所有这些谓词都可以附加到(几乎)任何用于切换函数参数的表达式,递归或其他.

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

  • 对,所以这也很好,``def load(nil),do:IO.puts("nil")``谢谢. (6认同)

ato*_*irk 7

我更喜欢

def load(nil), do: nil
def load([]), do: nil
def load(token), do: process(token)
Run Code Online (Sandbox Code Playgroud)

你也可以这样做:

def load([]), do: nil
def load(token) when not is_nil(token), do: process(token)
def load(_), do: nil
Run Code Online (Sandbox Code Playgroud)

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