elixir - 在 Elixir 中是否有与 Python 的 defaultdict 等效的东西?

标签 elixir

我想要一个 Elixir 映射,其中任何键都具有特定类型的默认值。使用或实现类似功能的最佳方式是什么?

最佳答案

最简单的方法是像这样使用 Map.get/3:

iex(1)> map = %{foo: "bar"}
%{foo: "bar"}
iex(2)> Map.get map, :foo, "baz"
"bar"
iex(3)> Map.get map, :fiz, "baz"
"baz"

如果你不想每次都指定默认值,你可以创建函数,“隐藏”默认值:

iex(4)> my_get = &(Map.get &1, &2, "baz")
#Function<12.90072148/2 in :erl_eval.expr/5>
iex(5)> my_get.(map, :foo)
"bar"
iex(6)> my_get.(map, :fiz)
"baz"

如果你的 map 没有改变,你可以创建一个函数,它只接受键作为参数:

iex(7)> my_get2 = &(Map.get map, &1, "baz")
#Function<6.90072148/1 in :erl_eval.expr/5>
iex(8)> my_get2.(:fiz)
"baz"
iex(9)> my_get2.(:foo)
"bar"

在@whatyouhide 评论后编辑: 如果您需要更通用的解决方案,例如不同键的不同默认值,您可以先定义工厂:

factory = fn (key) -> key end
map_ret_val = fn (nil, key) -> factory.(key)
                 (other, _key) -> other end
my_get3 = fn (map, key) -> map_ret_val.(map[key], key) end

关于elixir - 在 Elixir 中是否有与 Python 的 defaultdict 等效的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28045620/

相关文章:

hex - 如何使用 Elixir 打包/解包十六进制字符串(先是高半字节)

command-line-interface - 如何在启动 iex session 时执行一些命令?

elixir - 使用 Ecto,如何构建一个查询来返回出现在两个单独关联中的结果?

mocking - Elixir 中的时间旅行和时间卡住

erlang - 如何从 mnesia 中仅选择 X 条记录

elixir - 解压内部 tarball 失败 : invalid argument

elixir - 如何从任何链接进程获得任何崩溃通知?

elixir - ExUnit-在所有测试之前运行一次数据库设置代码

elixir - 在 Elixir 中运行 shell 命令

logging - 您可以为 Phoenix 的不同路线设置不同的日志级别吗?