Elixir - 模式匹配



模式匹配是 Elixir 從 Erlang 繼承的一項技術。它是一種非常強大的技術,允許我們從複雜的結構(如列表、元組、對映等)中提取更簡單的子結構。

匹配有兩個主要部分,左邊右邊。右邊是任何型別的結構。左邊嘗試匹配右邊的結構,並將左邊任何變數繫結到右邊的相應子結構。如果找不到匹配項,運算子將引發錯誤。

最簡單的匹配是左邊是一個單獨的變數,右邊是任何結構。此變數將匹配任何內容。例如,

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,“確保這裡有一些東西,但我並不關心它到底是什麼。”。在前面的示例中,_unused_var 就是這樣的一個變數。

我們可以使用此技術匹配更復雜的模式。例如,如果您想解包並在一個元組中獲取一個數字,該元組在一個列表中,該列表本身又在一個列表中,您可以使用以下命令:

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

上述程式生成以下結果:

24

這將把a繫結到 24。其他值被忽略,因為我們使用了'_'。

在模式匹配中,如果我們在右邊使用變數,則使用其值。如果要使用左邊變數的值,則需要使用固定運算子。

例如,如果您有一個值為 25 的變數“a”,並且希望將其與另一個值為 25 的變數“b”匹配,則需要輸入:

a = 25
b = 25
^a = b

最後一行匹配a的當前值,而不是將其賦值給b的值。如果我們有一組不匹配的左右兩側,匹配運算子將引發錯誤。例如,如果我們嘗試將元組與列表匹配,或者將大小為 2 的列表與大小為 3 的列表匹配,則會顯示錯誤。

廣告