我正在研究Elixir入门文档,并且遇到了一些我不了解输出的内容。在下面的例子中,我不明白为什么rest
最终成为" llo"或者为了这个事实,第一个结果是如何产生的,结果是"你好"而不是" hehello"。
iex> "he" <> rest = "hello"
"hello"
iex> rest
"llo"
答案 0 :(得分:7)
这是Elixir =
工作方式的结果。这不会评估为:
"he";
rest = "hello";
不,相反,它会进行模式匹配。 From the docs:
在本章中,我们将展示Elixir中的=运算符实际上是如何 匹配运算符以及如何将其用于模式匹配内部数据 结构。
(强调我的。)我链接到的章节解释了Elixir中=
符号与其他语言相比如何区别对待,并解释了您目睹的有些奇怪的行为。
=
符号必须两边相等。已经看右边我们有一个值为#34; hello&#34;的字符串。因此,左侧必须是一个字符串,也的值为&#34; hello&#34;。左侧的变量是休息。 "he" + rest = "hello"
。这个等式有一个独特的解决方案 - &gt; "he" + "llo" = "hello"
。最后,我们可以得出结论rest = "llo"
。
答案 1 :(得分:3)
虽然@Dair的答案很好,但我会将其添加到它的价值中。
想到Elixir&#34; =&#34;是有帮助的。比任务多一点。它更像是赋值和断言相结合。也就是说,如果通过赋值可以使语句成立,则赋值就会发生。否则会生成错误。
例如,考虑一下:
a = 1
看起来我正在向右分配1?但是请考虑一下:
1 = a
如何分配常数值?我不能。但我可以断言,他们是平等的,这是正在发生的事情的一部分。模式匹配运算符试图断言相等性,如果通过赋值使运算符的两边相等,则发生赋值。因此,当你比较时:
"he" <> rest = "hello"
通过分配&#34; llo&#34;可以使断言成为现实。休息,所以它是。
我希望这会增加一些清晰度。