elixir地图.put未更新地图



我有一个函数,它的参数是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_dataModuleA.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

最新更新