2015-05-15 9 views
13

Ich möchte gleichzeitig auf einen bestimmten Schlüssel in einer Karte übereinstimmen, und den Rest der Karte erfassen. Ich hatte gehofft, so etwas wie dies funktionieren würde:Elixier: Erfassen des Rests einer Karte mit Mustererkennung

iex(10)> %{"nodeType" => type | rest} = %{"nodeType" => "conditional", "foo" => "bar"} 

** (CompileError) iex:10: cannot invoke remote function IEx.Helpers.|/2 inside match 

Das Ziel ist, eine Reihe von Funktionen zu schreiben, die eine Karte nehmen, Mustererkennung auf einem der Karte auf den Feldern, und einige Transformationen auf den Rest der Karte durchführen.

Aber es sieht so aus, als würde ich den Angerufenen brauchen, um den nodeType separat zu übergeben, es sei denn, ich verpasse etwas.

+0

ich diese Syntax möchte. Ich wollte gerade die gleiche Frage stellen und hatte genau die gleiche Syntax 'def update_document (% {id: id, Revision: Revision | Rest}) do # couchdb Zeug hier Ende' –

+0

Allgemeiner Hinweis, das Feld' nodeType 'zeigt an, dass Sie mit einer' struct' im Gegensatz zu einer einfachen Karte besser bedient werden können. Siehe http://elixir-lang.github.io/getting-started/structs.html Ohne genau Ihren genauen Anwendungsfall zu kennen, kann ich nicht mit Sicherheit sagen, aber die abgebildete Verwendung ist ein Code-Geruch, für den Sie nicht das beste Werkzeug verwenden verfügbar. –

Antwort

11

Sie können die ganze Karte leicht erfassen - vielleicht wird das genug sein?

def handle_condition(all = %{"nodeType" => "condition"}) do 
    # do something with all 
end 

Oder:

def handle_condition(all = %{"nodeType" => "condition"}) do 
    all = Map.delete(all, "nodeType") 
    # do something with all 
end 
0

Eine weitere schöne Möglichkeit, dies zu erreichen, ist Map.pop/2 mit:

def handle(%{} = map), do: handle(Map.pop(map, "nodeType")) 

def handle({"condition", rest}) do 
    # ... handle conditions here 
end 

def handle({"expression", rest}) do 
    # ... handle expressions here 
end 
Verwandte Themen