2016-08-11 4 views
1

エリクサーで遊んでいます。このシナリオを考えてみましょう。私はどのようにパターンマッチ==と=?

iex> a = b = 1  #=> a = 1, b = 1 
iex> c = true 
iex> a == b  #=> true 
iex> true = c  #=> true 

したがって、私は以下がtrueを返すと仮定したが、違法なパターンを持っていると仮定した。 =演算子を使用する場合

iex> a == b = c 
** (CompileError) ... illegal pattern 
+0

同じことがErlangで真です。 'erl'で' 1 == 1 = 1'を実行すると、不正なパターンエラーが発生します。 '1 ==(1 = 1)'が動作します。 – Gazler

+0

真。私がやったのは、falseを返す '(a ==(b = c))'ではなく '((a == b)= c)'です。 – Bala

+0

@Gazler:あなたのコメントごとに '1 == 1 =真'ではなく、 '1 == 1 = 1'をやっています – Bala

答えて

1

、あなたがなく割り当てに一致パターンを実行一致演算子を使用しています。

=オペレータが動作する方法はこれです:実行時に

pattern = expression 

、左側が右側に一致しています。したがって、左側はパターンと呼ばれ、右側はエリクシール用語表現です。

私はパターンが何であるかの正式な定義を投げることができないだろうにもかかわらず、私はそれが表現と同じではないことを伝えることができます。 illegal patternのエラー状態として、パターンにはさらに制限があります。

通常、パターンは、コンパイル時の構文を使用できますが、実行時の値は使用できません。 タプル(ネストされているかどうか)、リスト、マップ、またはさらにはのパターンなどの基本型コンストラクタを使用できます。

例えば、これらは、これらの変数指定した有効なパターン、あるは結合していないです:

1 == 1 

a + b 

true != false 

a == b 

あなたは:

{:ok, content} 

[head | tail] 

1 

x 

{:ok, { day, month, year }, { hour, minute, second} } 

はしかし、次はパターン法的ではありません実行時の表現です右手側でこの種の表現を問題なく使用できますが、左手側では使用できません。

彼らは自動的にコンストラクタスタイルに変換してこれに対する例外は、++<>事業者になります(例えば"hello" <> "world"ため<<"hello", "world">>と同じである)

関連する問題