gpt4 book ai didi

elixir - get_in 访问行为药剂的可选默认值

转载 作者:行者123 更新时间:2023-12-04 16:05:54 25 4
gpt4 key购买 nike

是否可以选择在 get_in/2 中添加默认回退值? ?

设想:

merge_maps = get_in(
payload, ["msg", "clicks"]
) ++ get_in(
payload, ["msg", "opens"]
)

如果 key "clicks""opens"在嵌套 "msg" 中找不到 map , 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"]
)

最佳答案

您可以为 Kernel.get_in/2 编写自己的包装器,但使用默认值作为后备。

def get_in_attempt(data, keys, default) do
case get_in(data, keys) do
nil-> default
result -> result
end
end

所以在你的情况下就足够了
def get_in_attempt(data, keys) do
case get_in(data, keys) do
nil-> [] # your default is set, so don't need to pass it
result -> result
end
end

但是,使用第一种方法(使用显式 default 参数更灵活,可以在不同场景中重用)。

关于elixir - get_in 访问行为药剂的可选默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48781427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com