2016-08-09 23 views
1

habe ich eine Karte mit der Zeichenfolge "2" als einer der Schlüssel:Pattern-Matching-Karte mit String als Schlüssel

iex(14)> map = %{:a => 1, "2" => 2, :b => 3} 
%{:a => 1, :b => 3, "2" => 2} 

Jetzt bin ich nicht in der Lage, um es Muster zu entsprechen. Wie bekomme ich beispielsweise den Wert "2"? Ich habe versucht, die folgenden bekam aber die folgenden Fehler:

iex(23)> %{a: c, "2" z} = map 
** (SyntaxError) iex:23: syntax error before: "2" 

iex(23)> %{a: c, "2": z} = map 
** (MatchError) no match of right hand side value: %{:a => 1, :b => 3, "2" => 2} 

Antwort

2

Sie erinnern, dass, wenn Ihr Schlüssel ist kein Atom Sie können nicht die Syntax a: value verwenden, aber Sie müssen explizit die Kartensyntax verwenden: "a" => value.

Auch was ist wichtig, dass Sie nicht atom Syntax vor => verwenden können, so:

%{:a => a,"2" => value} = map # perfectly valid, everywhere use => 
%{"2" => value, a: a} = map # perfectly valid, atom syntax after regular 

Aber dieses ist ungültig:

%{a: a, "2" => value} = map 
** (SyntaxError) iex:5: syntax error before: "2" 

Mein Vorschlag: wenn Atome und Strings als Schlüssel Mischen Klarheit benutze immer reguläre Syntax.

7

Sie müssen => verwenden String-Schlüssel übereinstimmen.

Sie entweder => für alle Schlüssel verwenden können:

iex(1)> map = %{:a => 1, "2" => 2, :b => 3} 
%{:a => 1, :b => 3, "2" => 2} 
iex(2)> %{:a => c, "2" => z} = map 
%{:a => 1, :b => 3, "2" => 2} 
iex(3)> c 
1 
iex(4)> z 
2 

oder verwenden : für Atom-Tasten (sie nach den => Schlüssel sein sollte):

iex(5)> %{"2" => z, a: c} = map 
%{:a => 1, :b => 3, "2" => 2} 
iex(6)> z 
2 
iex(7)> c 
1 
Verwandte Themen