【发布时间】:2018-07-24 16:28:06
【问题描述】:
是否有在get_in/2 中添加默认后备值的选项?
场景:
merge_maps = get_in(
payload, ["msg", "clicks"]
) ++ get_in(
payload, ["msg", "opens"]
)
如果在嵌套的"msg" 映射中找不到键"clicks" 或"opens",get_in/2 将返回nil,然后引发错误:
** (ArgumentError) argument error
:erlang.++(nil, nil)
(stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
(iex) lib/iex/evaluator.ex:250: IEx.Evaluator.handle_eval/5
(iex) lib/iex/evaluator.ex:230: IEx.Evaluator.do_eval/3
(iex) lib/iex/evaluator.ex:208: IEx.Evaluator.eval/3
(iex) lib/iex/evaluator.ex:94: IEx.Evaluator.loop/1
(iex) lib/iex/evaluator.ex:24: IEx.Evaluator.init/4
如果能做类似的事情就好了
get_in(payload, ["msg", "clicks"], [])
如果没有找到具有该键的值,则空列表将是后备值。实现这一目标的正确方法是什么?
更新
感谢@PatNowak 的回答,我在get_in 周围实现了一个包装器:
defmodule Helpers.AccessHelper do
def get_in_attempt(data, keys, default \\ []) do
case get_in(data, keys) do
nil -> default
result -> result
end
end
end
然后在另一个文件中:
import Helpers.AccessHelper, only: [get_in_attempt: 2]
merge_maps = get_in_attempt(
payload, ["msg", "clicks"]
) ++ get_in_attempt(
payload, ["msg", "opens"]
)
【问题讨论】: