我正在阅读Elixir的pattern matching,我对=
运算符作为匹配运算符感到有些困惑。
该网站说
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
)?我何时会使用匹配运算符?
答案 0 :(得分:2)
- =成为匹配运营商意味着什么?
醇>
这意味着左边是否可以匹配右边,如果它们的值相等,它们可以匹配。
=
也可以用作绑定,这可能会让你感到困惑。请注意,bind不等于assign。
a = 1
是绑定值1到a。
1 = a
检查1是否匹配。
作为左操作符的变量都是绑定的,在这种情况下,绑定可能会与a =1
中的匹配混淆,因此有一个语法^
调用引脚操作符。
^a = 1
检查是否匹配1。
- 是否类似于1 == x(如果是这样,为什么它不返回true / false)?
醇>
如1中所述,它不是==
。 <{1}}在Elixir中为==
,将返回true或false。
- 我何时会使用匹配运算符?
醇>
您将在函数参数匹配,映射k-v匹配,函数返回值匹配等中使用它。
==
这一个是将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}
与其中一个不匹配时,将引发错误。
如果你进行更深入的学习,你可以在最后知道匹配是如何完美的。
答案 1 :(得分:1)
merge
是可能欺骗你的人为例子。通常,匹配运算符确保RHO与LHO匹配,这意味着LHO没有违反RHO的内容。这不是完全匹配,因为LHO可能通常a)确保只有RHO的一部分匹配,b)可能比等式检查更宽松(1 = x
)。
对于==
, 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
此处%{foo: my_var} = %{foo: 42}
与my_var
匹配,因为LHO 与RHO匹配且密钥相同。
相等运算符在两个方面有所不同:
42
失败,而%{} == %{foo: 42}
成功); %{} = %{foo: 42}
失败并显示“未定义函数my_var / 0”。)匹配的例子与ruby中的等号运算符不同(在ruby中,匹配运算符粗略的角色扮演三重相等,又称为等于三等):
%{foo: my_var} == %{foo: 42}