2016-08-11 84 views
1

玩弄药剂。考虑这种情况。我有如何模式匹配==和=?

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 
+0

也是如此在二郎山。在'erl'中执行'1 == 1 = 1.'会导致非法模式错误。 '1 ==(1 = 1)'起作用。 – Gazler

+0

是的。我试过的是((a == b)= c)'而不是'(a ==(b = c))',它会返回false。 – Bala

+0

@Gazler:根据你的评论,我正在做'1 == 1 = true'而不是'1 == 1 = 1' – Bala

回答

1

当使用=操作员,正在使用的匹配操作者,其执行模式匹配而不是分配

=运营商的工作方式是这样的:

pattern = expression 

在运行时,左侧匹配到右侧。所以,左侧被称为模式,而右侧是药剂期限表达

即使我不能够抛出一个什么样的模式是一个正式的定义,我可以告诉你,这是不一样的一个表达。由于错误状态,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">>