我有一个函数,它的参数是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
值,但密钥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
。