2017-02-10 3 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 совершенна, как обычно, я бы поставил мину здесь , для форматирования.

Это прекрасный пример того, когда эликсир «предотвращает» вас от неправильных действий. Если есть 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}] 
+0

К сожалению, это неверно: '[% {n: 1, name:: complete},% {n: 2, name:: p end}] |> Enum.find (&% {name:: pending} = & 1) # => ** (MatchError) нет соответствия значения правой стороны:% {n: 1, name:: complete} '. – Dogbert

+0

@ Dogbert действительно, но это выглядит глупо для меня. Вероятно, он должен работать (может быть, не так точно, но с каким-то другим методом «Enum.select/2» или подобным.) Я удалю этот ответ и полностью заполняю запрос функции. – mudasobwa

Смежные вопросы