2017-02-10 3 views
0

Gibt es eine Möglichkeit, diese Art von Verfahren zu verkürzen Anrufe:Übergabe von Argumenten an eine Funktion und ruft es über „&“

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

etwas wie folgt aus:

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

Das heißt, übergeben Sie den arithmetischen Operator "==", strukturieren Sie den Feldnamen name und den Wert :pending als Argumente.

Antwort

3

Sie können die partial application syntax für diesen Einsatz:

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

oder

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

, auch die Antwort von Dogbert ist perfekt, wie üblich, würde ich meine hier setzen zu , aus Gründen der Formatierung.

Dies ist ein perfektes Beispiel dafür, wenn Elixir Sie daran hindert, Dinge falsch zu machen. Wenn es keine solche Methode zur Hand gibt, bedeutet es ziemlich viel, dass der Ansatz falsch ist.

Sie suchen nach einer Struktur, die eine name mit Wert :pending hat. Tun Sie das ausdrücklich mit Kernel.match?/2 Makro:

iex> [%{n: 1, name: :pending}, %{n: 2, name: :complete}] 
    |> Enum.find(&match?(%{name: :pending}, &1)) 
%{n: 1, name: :pending} 

Zitat aus der Dokumentation:

match?/2 sehr nützlich ist, wenn das Filtern von Wert in einem enumerable finden:

list = [{:a, 1}, {:b, 2}, {:a, 3}] 
Enum.filter list, &match?({:a, _}, &1) 
#⇒ [{:a, 1}, {:a, 3}] 
+0

Leider ist das nicht korrekt: '[% {n: 1, Name:: vollständig},% {n: 2, Name:: p ending}] |> Enum.find (&% {name:: pending} = & 1) # => ** (MatchError) keine Übereinstimmung des rechten Wertes:% {n: 1, name:: complete} '. – Dogbert

+0

@Dogbert in der Tat, aber das sieht mir dumm. Es sollte wahrscheinlich funktionieren (vielleicht nicht so genau, aber mit einer anderen 'Enum.select/2' oder ähnlichen Methode). Ich werde diese Antwort entfernen und stattdessen eine Feature-Anfrage erfüllen. – mudasobwa

Verwandte Themen