2017-01-13 8 views
0

Ich stoße häufig auf Situationen, in denen ich mehrere Pipe-Typ-Konvertierungen in Form von to_x-Funktionen verwenden muss, um ordnungsgemäß auf Daten zuzugreifen/sie zu transformieren.Konvertierung von Idiomatic-Typen in Elixir

z.

IO.puts Enum.dedup Enum.intersperse(System.argv |> to_string |> to_charlist, 32) 

Dies scheint allzu ausführlich. Ist das idiomatisch oder fehlt mir hier etwas Grundlegendes?

Antwort

1

Ich verstehe, dass dies ein künstliches Beispiel ist, aber wenn Sie mehrere Typkonvertierungen benötigen, machen Sie es wahrscheinlich falsch. Die Option wäre, die richtigen Typen auszuwählen und sie in der gesamten Anwendung zu verwenden.

Ob Sie noch viele verrohrt Umwandlungen tun wollen, erklären Makros für sie:

defmacro to_chars(arg) do 
    quote bind_quoted: [arg: arg] do 
    arg |> to_string |> to_charlist 
    end 
end 

Und sie verwenden:

IO.puts System.argv 
     |> to_chars 
     |> Enum.intersperse(32) 
     |> Enum.dedup 
+0

Warum verwenden Sie hier ein Makro statt einer einfachen Funktion? – Dogbert

+0

@Dogbert, um es in Wachen verfügbar zu machen. – mudasobwa

+0

Aber weder 'to_string' noch' to_charlist' sind in Wachen erlaubt. – Dogbert

0

Ich weiß, dies ist nur ein Beispiel, aber man sollte die Verwendung richtige Funktionen. In diesem speziellen Beispiel können Sie Folgendes tun.

Dies würde verhindern, dass Sie die Konvertierung durchführen und hat immer noch das Ergebnis, das Sie erwarten.

+0

Das Beispiel, das ich verwendete, sollte ein Leerzeichen zwischen jedem Zeichen im ersten Argument einfügen. Tut mir leid, wenn das nicht klar war. – movsx

+0

Ihr Beispiel fügt ein Leerzeichen zwischen jedem Zeichen in allen Argumenten ein. Ich nahm an, du hast versucht, zwischen den Argumenten einen Raum zu schaffen. Mein Punkt steht immer noch, Sie müssen in der Regel nicht so viele Conversions durchführen. Es gibt im Allgemeinen Funktionen, um das zu tun, was Sie gerade tun. –