最简单的就是这样使用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"
Run Code Online (Sandbox Code Playgroud)
如果您不想每次都指定默认值,则可以创建"隐藏"默认值的函数:
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"
Run Code Online (Sandbox Code Playgroud)
如果您的地图没有改变,您可以创建一个只接受键作为参数的函数:
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"
Run Code Online (Sandbox Code Playgroud)
在@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
Run Code Online (Sandbox Code Playgroud)