[英]What is the purpose of match operator (=) in elixir?
我正在閱讀 Elixir 的 模式匹配,我對=
運算符是匹配運算符有點困惑。
網站說
Elixir,= 運算符實際上稱為匹配運算符。
它給出了這個例子:
iex> x = 1
1
iex> x
1
iex> 1 = x
1
iex> 2 = x
** (MatchError) no match of right hand side value: 1
出於某種原因,我仍然不明白1 = x
在做什么。 如果我將剛剛分配的變量的值放在=
的左側,則返回1
如果值不相同則拋出錯誤。 我真的看不出這有什么用。
=
是匹配運算符是什么意思? 它是否類似於1 == x
(如果是,為什么不返回true/false
)? 我什么時候會使用匹配運算符?
- = 作為匹配運算符意味着什么?
表示左邊是否可以匹配右邊,如果它們的值相等,則可以匹配。
=
也可以用作綁定,這可能會讓您感到困惑。 請注意,綁定不等於分配。
a = 1
是將值 1 綁定到 a。 1 = a
是檢查 1 是否匹配 a。
作為左運算符的變量都是綁定的,在這種情況下,bind 可能與a =1
match 混淆,因此有一個語法^
call pin operator。
^a = 1
是檢查 a 是否匹配 1。
- 它是否類似於 1 == x (如果是,為什么不返回真/假)?
正如 1 中提到的,它不是==
。 ==
在 Elixir 中是==
並且將返回 true 或 false。
- 我什么時候會使用匹配運算符?
您將在函數參數匹配、映射 kv 匹配、函數返回值匹配等中使用它。
case song_id_info do
"" -> ""
{:ok, song_id} -> song_id
{:error, reason} -> IO.puts "error get_song_id #{reason}"
end
這是將song_id_info
與""
, {:ok, song_id}
和{:error, reason}
匹配。 當song_id_info
與其中之一不匹配時,將引發錯誤。
如果你深入研究,你會知道最后匹配是如何完美工作的。
1 = x
是可能欺騙了您的人為示例。 通常,匹配運算符確保 RHO 與 LHO 匹配,這意味着 LHO 沒有任何違反 RHO 的內容。 這與精確匹配無關,因為 LHO 通常可能 a) 確保僅匹配 RHO 的一部分,並且 b) 可能比等式檢查 ( ==
) 更寬松。
在1
的情況下, 1
是1
,這就是示例看起來人為設計的原因。 另一方面,匹配運算符的=
是通用語法,涵蓋所有情況。 javascript 中的1 === 1
看起來也有點奇怪,人們可能會問“為什么我需要三等分”,只看這個例子。
另一方面,匹配運算符用於:
def print(1), do: ...
def print(other), do: ...
當在代碼中的某處調用print(my_var)
時,匹配運算符會在每個子句上隱式調用,按照子句聲明的順序從上到下,以查找匹配的子句。 也就是說,以下代碼:
defmodule M do
def print(1), do: "Neo"
def print(other), do: "toN Neo: #{other}"
end
my_var = 5
M.print(my_var)
#⇒ "toN Neo: 5"
大致相當於:
# ⇓ HERE match operator is used
if 1 = my_var do # this alone would raise MatchError
# but bear with me: ErlangVM
# takes care of that when finding
# a proper clause and it indeed
# uses match operator, not `==`
"Neo"
else
"toN Neo: #{other}"
end
case
匹配case my_var do
1 -> "Neo"
other -> "noT Neo: #{other}"
end
以上與之前大致相同。
下面的示例涉及比整數更復雜的術語,因為my_new_var = my_var
將被稱為binding ,盡管這只是術語混亂,我們也可以安全地將其稱為“匹配”而不失一般性。
%{foo: my_var} = %{foo: 42}
這里my_var
匹配到42
因為my_var
通常匹配 RHO並且鍵是相同的。
相等運算符有兩個不同之處:
%{} == %{foo: 42}
失敗,而%{} = %{foo: 42}
成功);%{foo: my_var} == %{foo: 42}
因“未定義函數 my_var/0”而失敗)。匹配與 ruby 中的相等運算符有何不同的示例(在 ruby 中,匹配運算符的角色大致扮演三重相等又名大小寫相等又名三重):
/n/ === "One" #⇒ true
String === "One" #⇒ true
->(s) { s.length == 3 } === "One" #⇒ true
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.