玩弄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
答案 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">>
相同)