我有此功能:
defmodule TestQuery do
def build_query() do
Enum.map(["test1", "test2", "hello"], fn item ->
query(item)
end)
end
def query(item) do
case item do
"test1" -> %{"test1" => 1}
"test2" -> %{"test2" => 2}
"hello" -> %{"hello" => 3}
end
end
end
和build_query返回这样的地图列表:
iex(2)> TestQuery.build_query
[%{"test1" => 1}, %{"test2" => 2}, %{"hello" => 3}]
但是有办法只返回这样的单个地图吗?
%{"test1" => 1, "test2" => 2, "hello" => 3}
我应该使用其他方法代替枚举吗?
我知道我可以在列表map.reduce和map.merge列表之后,但我想知道它是否可以在一个步骤中实现。
如果query/1
始终返回一对键/值,则可以使用into: %{}
使用for
并从query/1
返回元组:
defmodule TestQuery do
def build_query do
for item <- ["test1", "test2", "hello"], into: %{}, do: query(item)
end
def query(item) do
case item do
"test1" -> {"test1", 1}
"test2" -> {"test2", 2}
"hello" -> {"hello", 3}
end
end
end
IO.inspect TestQuery.build_query()
输出:
%{"hello" => 3, "test1" => 1, "test2" => 2}
如果它可以返回多个项目,则可以将"简化步骤"合并与地图,并以此为单位:
:defmodule TestQuery do
def build_query do
Enum.reduce(["test1", "test2", "hello"], %{}, fn item, acc ->
Map.merge(acc, query(item))
end)
end
def query(item) do
case item do
"test1" -> %{"test1" => 1}
"test2" -> %{"test2" => 2}
"hello" -> %{"hello" => 3}
end
end
end
IO.inspect TestQuery.build_query()
输出与上述相同。