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

时间:2018-12-20 11:54:32

标签: 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  <--- expected
false <--- not true ?!
:ok

m1.am3.b为什么不是相同的内存元组?

1 个答案:

答案 0 :(得分:3)

现代时代更新:似乎已在≈v1.7中修复。

这仅适用于Elixir;在Erlang中tuple is shared

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

对于Elixir,这可能是 ,因为内部转译为erlang duplicates maps之类。我想这对Elixir核心来说可能是一个很棒的错误报告。

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