枚举Elixir HashDict结构

时间:2015-12-03 12:25:55

标签: dictionary enums elixir

我是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行为。所以我想在这里:

  1. 对于给定的key1值,请检索value中的所有相应HashDict条目。这意味着忽略key2的值(所以选择全部)。
  2. 返回所有val2后,将它们全部添加(假设它们是整数,忽略val1)以给出总和。
  3. 所以我到目前为止:

    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{}
    

    但我似乎无法破解语法来实现我的两个目标。谢谢你的帮助!

1 个答案:

答案 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的文档。