为什么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