为什么值rest包含值" llo"

时间:2015-10-16 02:08:09

标签: elixir

我正在研究Elixir入门文档,并且遇到了一些我不了解输出的内容。在下面的例子中,我不明白为什么rest最终成为" llo"或者为了这个事实,第一个结果是如何产生的,结果是"你好"而不是" hehello"。

iex> "he" <> rest = "hello"
"hello"

iex> rest
"llo"

2 个答案:

答案 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;可以使断言成为现实。休息,所以它是。

我希望这会增加一些清晰度。