[英]Passing arguments to a function and calling it via “&”
有什么方法可以缩短这些方法的调用:
aaa = Enum.find(Statuses, fn(x) -> x.name == :pending end)
像这样:
aaa = Enum.find(Statuses, &==, [:name, :pending])
也就是说,要传递算术运算符“ ==”,将结构字段name
和值:pending
作为参数。
您可以为此使用部分应用程序语法 :
aaa = Enum.find(Statuses, &(&1.name == :pending))
要么
aaa = Enum.find(Statuses, & &1.name == :pending)
iex(1)> f = &(&1.name == :pending)
#Function<6.52032458/1 in :erl_eval.expr/5>
iex(2)> f.(%{name: :pending})
true
iex(3)> f.(%{name: :complete})
false
同样,Dogbert的答案是完美的,与往常一样,为了格式化,我也将我的答案也放在这里。
这是Elixir防止您以错误的方式行事的完美范例。 如果手头没有这样的方法,则说明该方法是错误的。
您正在寻找的结构name
为:pending
。 使用Kernel.match?/2
宏来明确地做到这一点:
iex> [%{n: 1, name: :pending}, %{n: 2, name: :complete}]
|> Enum.find(&match?(%{name: :pending}, &1))
%{n: 1, name: :pending}
从文档引用:
match?/2
在筛选可枚举值时非常有用:list = [{:a, 1}, {:b, 2}, {:a, 3}] Enum.filter list, &match?({:a, _}, &1) #⇒ [{:a, 1}, {:a, 3}]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.