有没有办法缩短这些方法调用:
aaa = Enum.find(Statuses, fn(x) -> x.name == :pending end)
这样的事情:
aaa = Enum.find(Statuses, &==, [:name, :pending])
即,将算术运算符“==”,结构字段名name
和值:pending
作为参数传递。
答案 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}]