簡體   English   中英

長生不老葯中匹配運算符(=)的目的是什么?

[英]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 )? 我什么時候會使用匹配運算符?

  1. = 作為匹配運算符意味着什么?

表示左邊是否可以匹配右邊,如果它們的值相等,則可以匹配。

=也可以用作綁定,這可能會讓您感到困惑。 請注意,綁定不等於分配。

a = 1是將值 1 綁定到 a。 1 = a是檢查 1 是否匹配 a。

作為左運算符的變量都是綁定的,在這種情況下,bind 可能與a =1 match 混淆,因此有一個語法^ call pin operator。

^a = 1是檢查 a 是否匹配 1。


  1. 它是否類似於 1 == x (如果是,為什么不返回真/假)?

正如 1 中提到的,它不是== ==在 Elixir 中是==並且將返回 true 或 false。

  1. 我什么時候會使用匹配運算符?

您將在函數參數匹配、映射 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的情況下, 11 ,這就是示例看起來人為設計的原因。 另一方面,匹配運算符的=是通用語法,涵蓋所有情況。 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並且鍵是相同的。

相等運算符有兩個不同之處:

  • LHO 必須完全等於 RHO( %{} == %{foo: 42}失敗,而%{} = %{foo: 42}成功);
  • LHO 不匹配分配尚未綁定的變量%{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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM