elixir - 长生不老药map.put不更新地图
问题描述
我有一个以 Map%{}
作为参数的函数
def set_data (data) do
...
end
我正在尝试data
使用map.put
.
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
上面的地图。
出于某种原因,当我尝试在函数中更新b
参数data
映射中的键时,所有内容都会复制映射中的nil
值ModuleA.EctoSchemaMap
,但键inner_key_a
也显示为 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
}
}
解决方案
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
.
推荐阅读
- express - 使用 npm link 和 npm run start:dev 时找不到服务的依赖项
- python - 在python中将0x000F转换为“0F”基本上试图转换为ASCII字符串
- javascript - 单击功能不适用于按钮
- python - 如何防止 HoughLines 多次检测某些行
- neo4j - Neo4j - 3 个不同查询的 UNION
- node.js - 可以使用标志调用 GCF 节点吗
- haskell - 无论输入递归如何,一个函数是否只调用自己一次?
- javascript - 如何防止类继承静态变量?
- python - Python Socket编程聊天程序客户端服务器
- python - 为什么系统说 :NameError: name 'self' is not defined