有什麼辦法來縮短這類方法的調用:傳遞參數的函數,並通過調用它的「&」
aaa = Enum.find(Statuses, fn(x) -> x.name == :pending end)
到這樣的事情:
aaa = Enum.find(Statuses, &==, [:name, :pending])
也就是說,是傳遞算術運算符「==」,結構字段名稱name
和值:pending
作爲參數。
有什麼辦法來縮短這類方法的調用:傳遞參數的函數,並通過調用它的「&」
aaa = Enum.find(Statuses, fn(x) -> x.name == :pending end)
到這樣的事情:
aaa = Enum.find(Statuses, &==, [:name, :pending])
也就是說,是傳遞算術運算符「==」,結構字段名稱name
和值:pending
作爲參數。
可以使用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
此外,通過Dogbert答案是完美的,像往常一樣,我願意把我的位置太,爲了格式化。
這是一個當Elixir「阻止」你以錯誤的方式做事的完美例子。如果手頭上有這樣的方法,那就意味着這種方法是錯誤的。
您正在尋找一個結構,它具有值爲:pending
的name
。做到這一點明確,與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}]
不幸的是,這是不正確的:'[%{n:1,name::complete},%{n:2,name::p結束}} |> Enum.find(&%{name :::pending} =&1)#=> **(MatchError)右側值不匹配:%{n:1,name::complete}'。 – Dogbert
@Dogbert確實,但這看起來很愚蠢。它應該可能工作(也許不是那種確切的方式,但有一些其他的'Enum.select/2'或類似的方法。)我將刪除這個答案,並完全填寫一個功能請求。 – mudasobwa