Почему обмен данными в Elixir / Erlang не работает для одного кортежа на двух картах - PullRequest
0 голосов
/ 20 декабря 2018

Учитывая следующий код

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.a и m3.b не являются одинаковыми кортежами в памяти?

1 Ответ

0 голосов
/ 20 декабря 2018

обновление современной эры: похоже, что оно было исправлено в ≈v1.7.

Это верно только для Elixir;в Erlang кортеж является общим :

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 , дублирует карты или т.п.,Я бы сказал, что это может быть отличным сообщением об ошибке в ядре Elixir.

В вашем примере :erts_debug.same(m1.a, m2.a) печатает true только из-за :erts_debug.same(m1, m2) #⇒ true, например, сами карты используют одну и ту же память.

...