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

问题描述 投票:9回答:2

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

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

 def load(token) do

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

 end
elixir
2个回答
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文档时请记住这一点。


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因为你会收到编译器的警告。

© www.soinside.com 2019 - 2024. All rights reserved.