2016-08-09 10 views
1

として:パターンマッチング文字列を使用してマップを、私はキーの一つとして文字列<code>"2"</code>でマップを作成したキー

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

は今、私はそれをパターンと一致することはできませんよ。たとえば、"2"に関連付けられた値を取得するにはどうすればよいですか?私は、次のことを試してみましたが、以下のエラーました:あなたは、文字列のキーと一致する=>を使用する必要が

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} 

答えて

2

あなたがたときに、あなたのことを忘れてはいけませんkeyは構文a: valueを使用できないアトムではありませんが、明示的にマップ構文("a" => value)を使用する必要があります。

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

しかし、この1は無効です::

はまた、どのようなので、あなたが=>前​​構文を使用することはできませんが重要です

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

私の提案:のためのキーとして原子と文字列とを混合したとき明快さは常に正規の構文を使用します。

7

を。

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 

または原子キーの:を使用します(彼らは=>キーの後でなければなりません):

あなたはすべてのキーのため=>を使用することができますいずれか

iex(5)> %{"2" => z, a: c} = map 
%{:a => 1, :b => 3, "2" => 2} 
iex(6)> z 
2 
iex(7)> c 
1 
関連する問題