【问题标题】:Strange behavior in Elixir when updating a MapSet inside a for loop在 for 循环中更新 MapSet 时 Elixir 中的奇怪行为
【发布时间】:2022-01-16 02:57:16
【问题描述】:
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)}")

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

【问题讨论】:

标签: elixir


【解决方案1】:

Elixir 中的作用域如下:

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

来源:Scoping Rules in Elixir (and 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]>

【讨论】:

  • for i &lt;- list1, into: map22, do: i#MapSet&lt;[2, 3, 4, 25]&gt;
  • 不错! @AdamMillerchip
【解决方案2】:

我知道您的示例是人为的,但是要将值列表添加到现有 MapSet,您可以使用 MapSet.union/2Enum.into/2

给定:

a = MapSet.new([1,2,3])
b = [4,5,6]

然后是以下两个:

MapSet.union(a, MapSet.new(b))
Enum.into(b, a)

产生#MapSet&lt;[1, 2, 3, 4, 5, 6]&gt;

【讨论】:

    猜你喜欢
    • 2014-03-15
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    相关资源
    最近更新 更多