在 for 循环内更新 MapSet 时 Elixir 中的奇怪行为

Sud*_*san 0 elixir

list1 = [2,3,4]
map22 = MapSet.new()
map22 = MapSet.put(map22,25)
for i <- list1 do
  map22 = MapSet.put(map22,i)
end
IO.puts("The updated map is #{inspect(map22)}")
Run Code Online (Sandbox Code Playgroud)

当我运行上面的程序时,我发现 for 循环中的更新根本不起作用。为什么会这样呢?

小智 5

Elixir 中的范围界定如下:

  1. 在周围范围中定义的任何变量都可以在它包含的所有其他范围中访问。
  2. 嵌套作用域中任何名称与周围作用域中的变量重合的变量都会隐藏该外部变量。换句话说,嵌套作用域内的变量暂时隐藏周围作用域中的变量,但不会以任何方式影响它。

来源:Elixir(和 Erlang)中的范围规则

回到您的问题,您希望将重新绑定从for范围中删除。例如:

list1 = [2, 3, 4]
map22 = MapSet.new()
map22 = MapSet.put(map22, 25)

map22 =
  for i <- list1, reduce: map22 do
    acc ->
      MapSet.put(acc, i)
  end

IO.inspect(map22)

#MapSet<[2, 3, 4, 25]>
Run Code Online (Sandbox Code Playgroud)