为什么Elixir/Erlang中的数据共享不适用于两个映射中的同一元组

为什么Elixir/Erlang中的数据共享不适用于两个映射中的同一元组,erlang,elixir,Erlang,Elixir,给定以下代码 defmodule Test do def run do p1 = {1, 2} m1 = %{a: p1} m2 = %{a: p1} IO.puts :erts_debug.same(m1.a, m2.a) m3 = %{b: p1} IO.puts :erts_debug.same(m1.a, m3.b) end end 为什么Test.run打印这个 iex(1)> Test.run true <---

给定以下代码

defmodule Test do
  def run do
    p1 = {1, 2}
    m1 = %{a: p1}
    m2 = %{a: p1}
    IO.puts :erts_debug.same(m1.a, m2.a)
    m3 = %{b: p1}
    IO.puts :erts_debug.same(m1.a, m3.b)
  end
end
为什么
Test.run
打印这个

iex(1)> Test.run
true  <--- expected
false <--- not true ?!
:ok
iex(1)>Test.run

真实的现代更新:似乎是在≈v1.7

这只适用于长生不老药;在Erlang中:

对于长生不老药,这可能是因为内部传输到erlang或类似。我会说这可能是一个伟大的错误报告,以长生不老药核心


在您的示例中,
:erts_debug.same(m1.a,m2.a)
仅由于
:erts_debug.same(m1,m2)而打印
true
#⇒真的
,例如,映射本身共享相同的内存。

这是否与Elixir允许变量“可变”这一事实有关,即不同于Erlang中的
A={1,2}
变量
A
在同一范围内永远绑定到该元组,在Elixir中,它可以反弹到另一个值,因为它在内部创建了新变量?@SashaFonseca Elixir不允许变量可变。它允许重新绑定,而不是,我不认为它与上述内容有任何关系。正如我所说的,我肯定这是关于不精确的语法转换。我理解你所说的变量是不可变的,它实际上是像你说的那样重新绑定的。我对“可变”的用法不正确
1> Tuple = {1, 2},
1> Key1 = 1,
1> Key2 = 2,
1> Map1 = #{1 => Tuple, 2 => Tuple},
1> erts_debug:same(maps:get(Key1,Map1), maps:get(Key2,Map1)).
true

2> Key3 = 3,
2> Map2 = #{3 => Tuple},
2> erts_debug:same(maps:get(Key1,Map1), maps:get(Key3,Map2)).
true