繁体   English   中英

将参数传递给函数并通过“&”调用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM