2016-09-13 2 views
3

Ich teile eine Zeichenfolge auf einem Zeichen und möchte alle Elemente in der resultierenden Aufteilung trimmen. Ich würde erwarten, dass die folgenden arbeiten, wie String.trim/1 existiert:Wie ordne ich eine bestimmte Funktion über eine Werteliste zu?

iex> "My delimited ! string of doom" |> String.split("!") |> Enum.map(String.trim) 
** (UndefinedFunctionError) function String.trim/0 is undefined or private. Did you mean one of: 

    * trim/1 
    * trim/2 

(elixir) String.trim() 

Ich erhalte eine UndefinedFunctionError, welche die Funktion String.trim/0 nicht vorhanden ist.

iex> "My delimited ! string of doom" |> String.split("!") |> Enum.map(fn (word) -> String.trim(word) end) 
["My delimited", "string of doom"] 

Hat Enum.map/2 erfordern eine anonyme Funktion als zweiter Parameter: Was ich will, ist mit einer anonymen Funktion übergeben Enum.map leicht zu bewerkstelligen? Kann ich meine gewünschte Funktion als Parameter angeben?

+0

Während @TheAnhLe Sie die richtige Antwort gegeben hat, ich denke, dass es fraglich ist, ob die aufgenommene Funktion der Code „besser“ macht. Ich meine, ich denke, die anonyme Funktion macht den Code ein wenig einfacher zu verstehen, aber YMMV. –

+0

@OnorioCatenacci Gibt es veröffentlichte Elixir Style Guides oder eine Illustration des idiomatischen Elixirs zum Übergeben von Funktionen als Argumente? Ich bin an Bord, um sauberen und prägnanten Code zu schreiben. –

+1

Es gibt das: https://github.com/levionessa/elixir_style_guide, aber es befasst sich nicht wirklich mit der Frage der Verwendung eines Capture im Gegensatz zu einer anonymen Funktion (zumindest soweit ich weiß). –

Antwort

6

Sie müssen & operator verwenden. Capture operator

Versuchen Sie folgendes:

iex()> "my delimited ! string of doom" |> String.split("!") |> Enum.map(&String.trim/1) 
["my delimited", "string of doom"] 
3

Obwohl die Antwort von @ theanh-le definitiv richtig und perfekt beantwortet Ihre Frage, Sie brauchen kein String#trim/1 hier überhaupt nicht. String#split/3 nimmt einen regulären Ausdruck:

iex(1)> "delimited ! string of doom" |> String.split(~r{\s*!\s*}) 
["delimited", "string of doom"] 
+0

Das Beispiel war ein wenig erfunden. Das Übergeben einer vorhandenen Funktion zum Zuordnen ist ziemlich Standard für jede funktionale Sprache und ich wollte verstehen, warum meine Erwartungen nicht korrekt waren. –

Verwandte Themen