2016-08-01 8 views
2

Ich habe einen Bereich, den ich an Enum.into ([]) leiten werde, der eine Warnung wirft. Was ist hier falsch?Bereich geleitet zu Enum.into wirft Warnung

iex(1)> 1..5 |> Enum.into ([]) 
warning: you are piping into a function call without parentheses... 

Nach der Zugabe von Klammern

iex(2)> (1..5) |> Enum.into ([]) 
warning: you are piping into a function call without parentheses... 

Antwort

4

Das Problem ist der Raum um das Argument zu . Es wird nicht als Klammer für den Funktionsaufruf interpretiert, sondern als Gruppierungsmechanismus für eines der Argumente. Leerzeichen sind zwischen Funktionsnamen und Argumenten nicht zulässig.

1..5 |> Enum.into ([]) ist das gleiche wie 1..5 |> Enum.into(([])) (wenn wir füllen die fehlende Klammer Compiler beschweren sich über). Was Sie wollten, ist wahrscheinlich 1..5 |> Enum.into([]), was ein korrekter Aufruf ist, über den sich der Compiler nicht beschwert.

+0

Eine Idee, warum 'Enumerable nicht für 90 implementiert 'wird geworfen, wenn ein einzelnes Element verwendet wird. z.B. '90 |> Enum.into ([])' – Bala

+0

Es entspricht dem Aufruf von 'Enum.into (90, [])'. Das erste Argument für die meisten Funktionen von 'Enum' muss das 'Enumerable'-Protokoll implementieren. Ganzzahlen implementieren es nicht - Aufzählbar sind Werte, die sich aus mehreren anderen Werten zusammensetzen. Ganzzahlen sind nur ein einzelner Wert, es macht keinen Sinn, 'Enumerable' für sie zu implementieren. – michalmuskala

0

Um die Warnung loszuwerden, setzen Sie Ihre Klammern um die ganze Enum.into shebang:

(1..5) |> (Enum.into []) 

ich nicht 100% sicher bin, warum Elixir klagt Hier; die Warnung erwähnt

foo 1 |> bar 2 |> baz 3 

sollte als

foo(1) |> bar(2) |> baz(3) 

, die neu geschrieben werden - nach meinem Verständnis - ist genau das, was Sie getan haben. Wahrscheinlich im Zusammenhang mit der teilweisen Anwendung von bis [].

+0

Das Problem (wie Michal Muskala hervorhebt) ist der Abstand zwischen dem Funktionsnamen und dem Argument. –