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

时间:2017-02-10 06:10:37

标签: elixir

有没有办法缩短这些方法调用:

aaa = Enum.find(Statuses, fn(x) -> x.name == :pending end) 

这样的事情:

aaa = Enum.find(Statuses, &==, [:name, :pending])

即,将算术运算符“==”,结构字段名name和值:pending作为参数传递。

2 个答案:

答案 0 :(得分:3)

您可以使用partial application syntax

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

答案 1 :(得分:0)

另外,Dogbert的回答是完美的,像往常一样,为了格式化,我也把它放在这里。

这是Elixir“阻止”你以错误的方式做事的完美例子。如果手头上有 no 这样的方法,那么这几乎意味着方法是错误的。

您正在寻找一个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}]