記事ディレクトリ
パターンマッチング
erlang
言語と同系列の言語として、当然元の言語のパターンマッチングの考え方をelixir
継承しているため、言語において等号は代入の役割も果たせるものの、実際にはマッチング演算子である。割り当て番号と比較して、パターン マッチングでは左側が変数である必要はありません。erlang
elixir
> x = 1
1
> 1 = x
1
> 2 = x
** (MatchError) no match of right hand side value: 1
(stdlib 4.3.1) erl_eval.erl:496: :erl_eval.expr/6
iex:9: (file)
ただしerlang
、 とは異なり、elixir
変数の再バインドをサポートしています。つまり、x
値が割り当てられた後、これに基づいて使用すると、x=2
2 つの意味が考えられます。1 つは一致すること、もう 1 つは再一致することです。つまり、 を再割り当てします。
この問題を回避するために、elixir
位置演算子が提供されています。^
> ^x=2 # 对x和2进行匹配,显然没匹配成功
** (MatchError) no match of right hand side value: 2
(stdlib 4.3.1) erl_eval.erl:496: :erl_eval.expr/6
iex:9: (file)
> x = 2 # 对x重新绑定为2
2
場合
elixir
のフロー制御の考え方はerlang
メイン機能である のフロー制御と同じでcase
ループをサポートしていないため、ループを望まない場合は再帰を実装する必要があります。
case
これはマッチングおよびスクリーニングのメカニズムであり、elixir
パターン マッチングのアイデアと非常に一致しています。その基本的な構文は次のとおりです。
case ... do
aaa ->
bbb ->
end
以下のモジュールに新しい関数を作成します。
# Test.ex
defmodule Test do
def caseTest(num) do
case num do
1 -> "you input 1"
2 -> "you input 2"
_ -> "you didn't input 1 or 2"
end
end
end
テスト結果は次のとおりです
>iex Test.ex
iex(1)> Test.caseTest(1)
"you input 1"
iex(2)> Test.caseTest(2)
"you input 2"
iex(3)> Test.caseTest(3)
"you didn't input 1 or 2"
条件
case
静的なコンテンツのみを照合でき、式の照合結果は照合できないのが特徴ですが、cond
この欠点を補うために、照合条件に式を入力できます。Test
モジュールでテストしてみましょうcond
def condTest(x) do
cond do
x*x < 10 -> "#{x}^2<10"
x*x < 100 and x*x >= 10 -> "#{x}^2 in [10, 100)"
x*x > 100 -> "#{x}^2 > 100"
end
end
テストを受けてください
iex(1)> Test.condTest(20)
"20^2 > 100"
cond
これはより柔軟な代替手段であるだけでなくcase
、他の言語のステートメントをマークするために使用することもできるためif..else if
、複数の条件の判断がサポートされます。
キーと値のペアのタイプ
elixir
キーワード リスト、フォーム、辞書などのキーと値のペアが提供されます。いわゆるキーと値のペアは、対応するデータ構造にインデックスを付けるために使用されますkey
。value
呼び出しのロジックは のロジックcase
と似ていますcase
。式とキー-value ペアは、一致する内容に応じて対応する値を返します。
キーワードリストの例は次のとおりです
> lst = [{:a, 0x61}, {:b, 0x62}, {:c, 0x63}]
[a: 97, b: 98, c: 99]
> lst[:a]
97
つまり、それぞれは{}
キーと値のペアのセットであり、キーはアトムである必要があります。
フォームは比較的柔軟で、少なくともあらゆる種類のキーをサポートしています。例は次のとおりです。
> map = %{"a"=>0x61, "b"=>0x62}
%{"a" => 97, "b" => 98}
> map["a"]
97
%{}
その文法形式はキーワード リストの形式とは異なり、すべてのキーと値のペアは にあり、キーと値の間のマッピング関係は=>
記号によって完成されることがわかります。
ではelixir
、キーワード リストとフォームは辞書の特殊な表現として理解でき、Dict
フォームとキーワード リストに対する一連の関数は辞書モジュールにカプセル化されています。この記事では主にelixir
パターンマッチングの考え方を紹介しますので、これらのケースについては後ほど説明します。