【问题标题】:elixir map.put not updating map长生不老药map.put不更新地图
【发布时间】:2021-04-02 13:25:03
【问题描述】:

我有一个以 Map %{} 为参数的函数

def set_data (data) do
...
end

我正在尝试使用map.put 更新参数data

data是这样的平面地图

%{
 a: ...
 b: ...
 c: ...
}

我遇到的问题是在 data 映射中设置一个键/属性,另一个映射如下所示:

ModuleA.EctoSchemaMap{
 some_key: nil,
 another_key: ModuleB.EctoSchemaMap{
  inner_key_a: "456",
  inner_key_b: nil
 }
}

ModuleA.EctoSchemaMap 上面的这个映射是从这样的函数调用返回的

some_data = get_data()

所以some_data = ModuleA.EctoSchemaMap 上面的地图。

由于某种原因,当我尝试更新函数中参数 data 映射中的键 b 时,所有内容都将复制 ModuleA.EctoSchemaMap 映射中的 nil 值,但键 @ 987654338@ 也显示为 nil,即使在 some_data 显示之前 inner_key_a 不是 nil

data
|> map.put(:a, "123")
|> map.put(:b, some_data)

在完成上述管道之后,我期待 data 更新 :b 的值

b: ModuleA.EctoSchemaMap{
    some_key: nil,
    another_key: ModuleB.EctoSchemaMap{
     inner_key_a: "456", //I need this value to be there
     inner_key_b: nil
    }
   }

但它却显示了这个

b: ModuleA.EctoSchemaMap{
    some_key: nil,
    another_key: ModuleB.EctoSchemaMap{
     inner_key_a: nil, //NOT sure why this is being set as nil even though `some_data` had a value for this
     inner_key_b: nil
    }
   }

【问题讨论】:

  • 你确定是map 而不是Map
  • 如何知道它正在更新键 :a_key 的原始映射?请添加更新原地图的校验码。
  • 它是一个Map,就像%{}
  • 您能否展示一个完整的代码示例?如果您能够准确地向我们展示您正在运行的内容以及您期望它返回的内容,它将帮助您获得更好的响应。
  • @hnhl - 请包含工作代码 sn-p。您包含了多个不添加到完整可执行脚本的部分。很难判断问题可能是什么 - 它可能与 Ecto 有关,或者与不变性有关。如果由于某种原因无法发布实际代码,请尝试创建stackoverflow.com/help/minimal-reproducible-example

标签: elixir


【解决方案1】:

Elixir 中的所有数据结构都是不可变的。在代码中,Map.put 使用您添加/更新的给定键值创建地图的新副本。但它不会存储在任何地方。所以,重新分配变量data_map

data_map = data_map
|> map.put(:some_key, data)

由于您在管道中只有一个操作,因此推荐的方法是-

data_map = Map.put(data_map, :some_key, data)

还要注意它是Map 而不是map

【讨论】:

  • 对不起,我没听懂,你是不是建议不要使用管道,而只是这样做data_map = Map.put(data_map, :some_key, data)?此外,还有其他 map.puts,它正在更新原始地图。它仅适用于未更新的特定密钥。我更新了我的帖子以显示
  • @hnhl 如果您只在管道中执行一项操作,我建议不要使用管道。
  • 不止一个操作
  • @hnhl Yeh,它不在问题的第一版中。这就是我推荐它的原因。没关系。
  • 我重写了问题以便更清楚地了解我的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多