Elixir-パターンマッチング

パターンマッチングは、ElixirがErlangから継承する手法です。これは、リスト、タプル、マップなどの複雑なデータ構造からより単純な下位構造を抽出できる非常に強力な手法です。

試合には2つの主要な部分があります。 leftright側。右側はあらゆる種類のデータ構造です。左側は、右側のデータ構造を照合し、左側の変数を右側のそれぞれのサブ構造にバインドしようとします。一致するものが見つからない場合、オペレーターはエラーを発生させます。

最も単純な一致は、左側の1つの変数と、右側のデータ構造です。 This variable will match anything。例えば、

x = 12
x = "Hello"
IO.puts(x)

構造内に変数を配置して、部分構造をキャプチャできるようにすることができます。例えば、

[var_1, _unused_var, var_2] = [{"First variable"}, 25, "Second variable" ]
IO.puts(var_1)
IO.puts(var_2)

これにより、値が保存されます。 {"First variable"}VAR_1"Second variable"VAR_2。特別なものもあります_ 変数(または「_」で始まる変数)は、他の変数とまったく同じように機能しますが、elixirに通知します。 "Make sure something is here, but I don't care exactly what it is."。前の例では、_unused_varはそのような変数の1つでした。

この手法を使用して、より複雑なパターンを照合できます。ためにexample それ自体がリストにあるリスト内にあるタプルの番号をアンラップして取得する場合は、次のコマンドを使用できます。

[_, [_, {a}]] = ["Random string", [:an_atom, {24}]]
IO.puts(a)

上記のプログラムは次の結果を生成します-

24

これはバインドされます a '_'を使用しているため、他の値は無視されます。

パターンマッチングでは、変数を使用すると right、その値が使用されます。左側の変数の値を使用する場合は、ピン演算子を使用する必要があります。

たとえば、値が25の変数「a」があり、それを値が25の別の変数「b」と照合する場合は、-を入力する必要があります。

a = 25
b = 25
^a = b

最後の行はの現在の値と一致します a、を割り当てる代わりに、の値に b。左側と右側の一致しないセットがある場合、一致演算子はエラーを発生させます。たとえば、タプルをリストと一致させようとしたり、サイズ2のリストをサイズ3のリストと一致させようとすると、エラーが表示されます。