2015-11-09 11 views
7

Ich versuche, einige Werte aus einer Karte in Elixir herauszufiltern.Verwenden von Rohr mit Filter und Karte in Elixier

Dies:

params = %{"blah" => "blah", "vtha" => "blah"} 
params 
    |> Enum.filter fn {k, v} -> k == v end 
    |> Enum.map(fn {k, v} -> {k, v} end) 

Ergebnis in diesem Fehler: ** (FunctionClauseError) keine Funktion Klausel Anpassung in Enumerable.Function.reduce/3

Aber sowohl die Filter- und Kartenoperationen in Isolation arbeiten .

Enum.filter params, fn {k, v} -> k == v end 
Enum.map(params, fn {k, v} -> {k, v} end) 

Sie funktionieren nicht, wenn piped.

Ich bin sicher, ich vermisse etwas offensichtlich.

Antwort

11

BEARBEITEN Auf dem Master-Zweig von Elixir wird der Compiler warnen, wenn eine Funktion ohne Klammern übergeben wird, wenn es Argumente gibt.


Sie müssen explizite Klammer für Enum.filter wie der Funktionsaufruf eine stärkere Priorität als der Rohrbetreiber unterzeichnet hat.

params = %{"blah" => "blah", "vtha" => "blah"} 
params 
    |> Enum.filter(fn {k, v} -> k == v end) 
    |> Enum.map(fn {k, v} -> {k, v} end) 

Eine genauere Erklärung finden Sie unter Why Can't I Chain String.replace?.

+0

Danke! Ich wusste, dass es etwas Offensichtliches sein würde. :) –