Elixir 中匹配运算符 (=) 的用途是什么?

Igg*_*ggy 5 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
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我仍然不明白在1 = x做什么。1如果我将刚刚分配的变量的值放在左侧,它会返回=,如果值不相同,则会抛出错误。我真的不明白这有什么用。

=成为匹配操作员意味着什么?它是否类似于1 == x(如果是,为什么不返回true/false)?我什么时候会使用匹配运算符?

Ale*_*kin 2

1 = x这是一个可能欺骗你的人为例子。一般来说,匹配运算符确保 RHO 与 LHO 匹配,这意味着 LHO 没有任何违反 RHO 的内容。\xe2\x80\x99 与精确匹配无关,因为 LHO 通常可能 a) 确保仅匹配 RHO 的一部分,b) 可能比相等检查 ( ) 更宽松==

\n\n

在 的情况下1 \ xe2\x80\x99 就是为什么这个例子看起来很做作的原因。另一方面,对于匹配运算符来说是通用语法,涵盖了所有情况。在 javascript 中看起来也有点奇怪,有人可能会问 \xe2\x80\x9c 为什么我需要三等号,\xe2\x80\x9d 只看到这个例子。11=1 === 1

\n\n

另一方面,匹配运算符用于:

\n\n

函数子句匹配

\n\n\n\n
def print(1), do: ...\ndef print(other), do: ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

print(my_var)在代码中的某处调用时,会按照子句声明的顺序从上到下对每个子句隐式调用匹配运算符,以查找匹配的子句。也就是说,以下代码:

\n\n
defmodule M do\n  def print(1), do: "Neo"\n  def print(other), do: "toN Neo: #{other}"\nend\n\nmy_var = 5\nM.print(my_var)\n#\xe2\x87\x92\xc2\xa0"toN Neo: 5"\n
Run Code Online (Sandbox Code Playgroud)\n\n

大致相当于:

\n\n
#    \xe2\x87\x93 HERE match operator is used\nif 1 = my_var do # this alone would raise MatchError\n                 # but bear with me: ErlangVM\n                 # takes care of that when finding\n                 # a proper clause and it indeed\n                 # uses match operator, not `==`\n  "Neo"\nelse\n  "toN Neo: #{other}"\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

case匹配

\n\n
case my_var do\n  1 -> "Neo"\n  other -> "noT Neo: #{other}"\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

上面的内容和以前大致相同。

\n\n

有选择地分配变量的纯代码

\n\n

下面的示例涉及比整数更复杂的术语,因为它my_new_var = my_var被称为“绑定”,尽管这只是一个术语混乱,我们也可以安全地将其称为“\xe2\x80\x9cmatching\xe2\x80\x9d\xc2\xa0”,而不会丢失的普遍性。

\n\n
%{foo: my_var} = %{foo: 42}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里my_var得到匹配是42因为 LHO一般与 RHO 匹配并且密钥是相同的。

\n\n

相等运算符有两个不同之处:

\n\n
    \n
  • LHO 必须完全等于 RHO(%{} == %{foo: 42}失败,%{} = %{foo: 42}成功);
  • \n
  • LHO与分配尚未绑定的变量不匹配(%{foo: my_var} == %{foo: 42}因 \xe2\x80\x9cundefined 函数 my_var/0\xe2\x80\x9d 失败)。
  • \n
\n\n
\n\n

ruby 中匹配与相等运算符有何不同的示例(在 ruby​​ 中,匹配运算符的作用大致为三等号,又名大小写等于,又名三等号):

\n\n
/n/ === "One"                       #\xe2\x87\x92\xc2\xa0true\nString === "One"                    #\xe2\x87\x92\xc2\xa0true\n->(s) { s.length == 3 } === "One"   #\xe2\x87\x92\xc2\xa0true\n
Run Code Online (Sandbox Code Playgroud)\n