无法更新哈希值

时间:2016-08-09 11:23:24

标签: elixir

我有一个结构,它有一个嵌套键和另一个结构列表,我想用新值更新嵌套键值。

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

2 个答案:

答案 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