我正在阅读 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)?我什么时候会使用匹配运算符?
1 = x这是一个可能欺骗你的人为例子。一般来说,匹配运算符确保 RHO 与 LHO 匹配,这意味着 LHO 没有任何违反 RHO 的内容。\xe2\x80\x99 与精确匹配无关,因为 LHO 通常可能 a) 确保仅匹配 RHO 的一部分,b) 可能比相等检查 ( ) 更宽松==。
在 的情况下,1 \ xe2\x80\x99 就是为什么这个例子看起来很做作的原因。另一方面,对于匹配运算符来说是通用语法,涵盖了所有情况。在 javascript 中看起来也有点奇怪,有人可能会问 \xe2\x80\x9c 为什么我需要三等号,\xe2\x80\x9d 只看到这个例子。11=1 === 1
另一方面,匹配运算符用于:
\n\ndef print(1), do: ...\ndef print(other), do: ...\nRun Code Online (Sandbox Code Playgroud)\n\n当print(my_var)在代码中的某处调用时,会按照子句声明的顺序从上到下对每个子句隐式调用匹配运算符,以查找匹配的子句。也就是说,以下代码:
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"\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n\ncase匹配case my_var do\n 1 -> "Neo"\n other -> "noT Neo: #{other}"\nend\nRun Code Online (Sandbox Code Playgroud)\n\n上面的内容和以前大致相同。
\n\n下面的示例涉及比整数更复杂的术语,因为它my_new_var = my_var被称为“绑定”,尽管这只是一个术语混乱,我们也可以安全地将其称为“\xe2\x80\x9cmatching\xe2\x80\x9d\xc2\xa0”,而不会丢失的普遍性。
%{foo: my_var} = %{foo: 42}\nRun Code Online (Sandbox Code Playgroud)\n\n这里my_var得到匹配是42因为 LHO一般与 RHO 匹配并且密钥是相同的。
相等运算符有两个不同之处:
\n\n%{} == %{foo: 42}失败,%{} = %{foo: 42}成功);%{foo: my_var} == %{foo: 42}因 \xe2\x80\x9cundefined 函数 my_var/0\xe2\x80\x9d 失败)。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\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
914 次 |
| 最近记录: |