如何模式匹配==和=?

时间:2016-08-11 12:06:27

标签: elixir

玩弄Elixir。考虑这种情况。我有

iex> a = b = 1     #=> a = 1, b = 1
iex> c = true
iex> a == b        #=> true
iex> true = c      #=> true

因此我假设下面的内容会返回true,但是会出现非法模式。

iex> a == b = c  
** (CompileError) ... illegal pattern

1 个答案:

答案 0 :(得分:1)

使用=运算符时,您使用的是匹配运算符,该运算符执行模式匹配而非赋值

=运算符的工作方式是:

pattern = expression

在运行时,左侧与右侧匹配。因此,左侧称为模式,而右侧是Elixir术语表达式

即使我无法对模式的内容进行正式定义,但我可以告诉您它与表达式不同。正如 illegal pattern 错误所述,对模式的限制更多。

通常,模式可以使用编译时结构,但不能使用运行时值。 您可以使用基类型构造函数(如元组(嵌套或非嵌套),列表,映射甚至常量)作为模式

例如,这些是有效的模式,因为这些变量是未绑定的:

{:ok, content}

[head | tail]

1

x

{:ok, { day, month, year }, { hour, minute, second} }

但是,以下是不合法模式的运行时表达式:

1 == 1

a + b

true != false

a == b

您可以在右侧使用这种表达方式,但不在左侧。

这是一个例外++<>运算符,因为它们会自动转换为构造函数样式(例如"hello" <> "world"<<"hello", "world">>相同)