绑定与分配

Tal*_*boy 5 ruby binding functional-programming elixir variable-assignment

我读过的区别了一些文章assignmentbinding,但它还未点击(特别是在命令式语言VS一个没有突变的情况下)。

我在IRC中询问,有人提到这两个示例说明了差异,但是后来我不得不去了,但我没有看到完整的解释。

有人可以详细解释此工作方式/原因,以帮助说明差异吗?

红宝石

x = 1; f = lambda { x }; x = 2; f.call
#=> 2
Run Code Online (Sandbox Code Playgroud)

长生不老药

x = 1; f = fn -> x end; x = 2; f.()
#=> 1
Run Code Online (Sandbox Code Playgroud)

rya*_*ter 9

我以前听过这个解释,看起来还不错:

您可以将绑定视为手提箱上的标签,将赋值视为手提箱。

在其他语言中,您需要赋值,这更像是在手提箱中放置一个值。您实际上更改了手提箱中的值并放入了不同的值。

如果你有一个手提箱,里面有一个值,在Elixir 中,你在上面贴上标签。您可以更改标签,但手提箱中的值仍然相同。

因此,例如:

iex(1)> x = 1
iex(2)> f = fn -> x end
iex(3)> x = 2
iex(4)> f.()
1
Run Code Online (Sandbox Code Playgroud)
  1. 你有一个手提箱,你给1它贴上标签x
  2. 然后你说,“函数先生,我想让你在我打电话给你的时候告诉我这个手提箱里有什么。”
  3. 然后,您将标签从手提箱上取下,1并将其放在另一个手提箱上2
  4. 然后你说“嘿,函数先生,那个手提箱里有什么?”

他会说“1”,因为手提箱没有改变。虽然,您已经取下标签并将其放在另一个手提箱上。


Ale*_*kin 5

过了一会儿,我想出了一个答案,这可能是对“绑定”和“赋值”之间区别的最好解释;它与我在另一个答案中所写的内容没有任何共同之处,因此它作为单独的答案发布。

在任何一切都是不可变的函数式语言中,术语“绑定”和“赋值”之间没有有意义的区别。人们可能会这样称呼它;常见的模式是使用“绑定”一词,明确表示它是绑定到变量的值。例如,在 Erlang 中,不能反弹一个变量。在 Elixir 中这是可能的(为什么,看在上帝的份上,Jose?,为了什么?)

考虑 Elixir 中的以下示例:

iex> x = 1
iex> 1 = x
Run Code Online (Sandbox Code Playgroud)

以上是完全有效的 Elixir 代码。很明显,一个人不能分配任何东西给一个。它既不是赋值也不是绑定。它是匹配的。这就是=Elixir(和 Erlang)中的处理方式:a = b如果两者都绑定到不同的值,则失败;如果匹配,则返回 RHO;如果 LHO 尚未绑定,它会将 LHO 绑定到 RHO。

在 Ruby 中则不同。存在分配(复制的内容,)和结合之间的差异显著(制造参考)。