elixir中匹配运算符(=)的目的是什么?

时间:2018-03-07 05:07:24

标签: elixir

我正在阅读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)?我何时会使用匹配运算符?

2 个答案:

答案 0 :(得分:2)

  
      
  1. =成为匹配运营商意味着什么?
  2.   

这意味着左边是否可以匹配右边,如果它们的值相等,它们可以匹配。

=也可以用作绑定,这可能会让你感到困惑。请注意,bind不等于assign。

a = 1是绑定值1到a。 1 = a检查1是否匹配。

作为左操作符的变量都是绑定的,在这种情况下,绑定可能会与a =1中的匹配混淆,因此有一个语法^调用引脚操作符。

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

  
      
  1. 是否类似于1 == x(如果是这样,为什么它不返回true / false)?
  2.   

如1中所述,它不是==。 <{1}}在Elixir中为==,将返回true或false。

  
      
  1. 我何时会使用匹配运算符?
  2.   

您将在函数参数匹配,映射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)。

对于== 11 ,这就是为什么这个例子看起来很人为。另一方面,匹配运算符的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匹配且密钥相同。

相等运算符在两个方面有所不同:

  • LHO必须与RHO完全相同(42失败,而%{} == %{foo: 42}成功);
  • LHO未匹配分配尚未绑定的变量(%{} = %{foo: 42}失败并显示“未定义函数my_var / 0”。)

匹配的例子与ruby中的等号运算符不同(在ruby中,匹配运算符粗略的角色扮演三重相等,又称为等于三等):

%{foo: my_var} == %{foo: 42}