2017-02-10 90 views
0

有什么办法来缩短这类方法的调用:传递参数的函数,并通过调用它的“&”

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

到这样的事情:

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

也就是说,是传递算术运算符“==”,结构字段名称name和值:pending作为参数。

回答

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 
0

此外,通过Dogbert答案是完美的,像往常一样,我愿意把我的位置太,为了格式化。

这是一个当Elixir“阻止”你以错误的方式做事的完美例子。如果手头上有这样的方法,那就意味着这种方法是错误的。

您正在寻找一个结构,它具有值为:pendingname。做到这一点明确,与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}] 
+0

不幸的是,这是不正确的:'[%{n:1,name::complete},%{n:2,name::p结束}} |> Enum.find(&%{name :::pending} =&1)#=> **(MatchError)右侧值不匹配:%{n:1,name::complete}'。 – Dogbert

+0

@Dogbert确实,但这看起来很愚蠢。它应该可能工作(也许不是那种确切的方式,但有一些其他的'Enum.select/2'或类似的方法。)我将删除这个答案,并完全填写一个功能请求。 – mudasobwa

相关问题