我是Elixir的新手,我正在尝试编写一个GenServer
来存储HashDict
中的键值对。存储复合键和值很好。这是代码:
#Initialise the HashDict GenServer.start_link
def init(:ok) do
{:ok, HashDict.new}
end
#Implement the server call back for GenServer.cast
def handle_cast({:add, event}, dict) do
{foo, bar, baz, qux} = event
key = %{key1: foo, key2: bar}
value = %{val1: baz, val2: qux}
{:noreply, HashDict.put(dict, key, value) }
end
一切都好。但是我无法实现我想要的handle_call
行为。所以我想在这里:
key1
值,请检索value
中的所有相应HashDict
条目。这意味着忽略key2
的值(所以选择全部)。val2
后,将它们全部添加(假设它们是整数,忽略val1
)以给出总和。所以我到目前为止:
def handle_call({:get, getKey}, _from, dict) do
key = %{key1: getKey, key2: _}
{:reply, HashDict.fetch(dict, key), dict}
end
这不起作用,因为无法在_
上模式匹配。据推测,我会在地图上使用某种Enumeration
来实现我的第二个目标:
Enum.map(mymap, fn {k, v} -> v end)|> Enum.sum{}
但我似乎无法破解语法来实现我的两个目标。谢谢你的帮助!
答案 0 :(得分:1)
如果我理解你的问题,以下内容应该可以完成你想要做的事情:
def handle_call({:get, getKey}, _from, dict) do
sum = Enum.reduce(dict, 0, fn
({%{key1: key1}, %{val2: val2}}, acc)
when key1 === getKey
and is_integer(val2) ->
val2 + acc
(_, acc) ->
acc
end)
{:reply, sum, dict}
end
有关详细信息,请参阅Enum.reduce/3
的文档。