エリクサー言語の本質: パターンマッチング

パターンマッチング

erlang言語と同系列の言語として、当然元の言語のパターンマッチングの考え方をelixir継承しているため、言語において等号は代入の役割も果たせるものの、実際にはマッチング演算子である。割り当て番号と比較して、パターン マッチングでは左側が変数である必要はありません。erlangelixir

> 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=22 つの意味が考えられます。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キーワード リスト、フォーム、辞書などのキーと値のペアが提供されます。いわゆるキーと値のペアは、対応するデータ構造にインデックスを付けるために使用されますkeyvalue呼び出しのロジックは のロジック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パターンマッチングの考え方を紹介しますので、これらのケースについては後ほど説明します。

おすすめ

転載: blog.csdn.net/m0_37816922/article/details/130925444