我有一个结构,它有一个嵌套键和另一个结构列表,我想用新值更新嵌套键值。
source = get_data
# source.key1 is an array of structs
source.key1 = Enum.each(source.key1, fn(x) -> # error is here at "="
# ...
end)
错误是:
cannot invoke remote function source.key1/0 inside match
这两个:
aa = Enum.each(source.key1, fn(x) ->
# ...
end)
source.key1 = aa # error is here
答案 0 :(得分:1)
您无法使用source.key1 = ...
您看到的错误是在模式匹配期间尝试调用函数的结果。
要更新地图,您可以执行以下操作:
%{source | key1: aa}
如果地图中尚不存在key1
,则会引发此问题。
或者:
Map.put(source, :key1, aa)
如果地图中尚不存在key1
,则不会引发此情况。
您还应注意Enum.each
的结果是原子:ok
,因此这会将key1
设置为:ok
。
也许你想要一个Enum.map/2?
您还应该查看update_in/3
答案 1 :(得分:0)
如果你有一张地图,如下所示:
my_map = %{a: "a", "b" => b}
您可以通过以下方式访问它:
my_map.a获取“a” my_map [:a]获取“a” my_map [“b”]获取“b”
您不能对密钥应用atom
语法,而不是原子。
要更新地图,您应该使用两个功能:
Map.put(my_map, "new_key", "new_value")
or
Map.update(my_map, "new_key", "init value", fn for add values) # handy in recursion loop
还有Map.update!/3
,但如果密钥不在地图中,它会引发KeyError
。