作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否可以选择在 get_in/2
中添加默认回退值? ?
设想:
merge_maps = get_in(
payload, ["msg", "clicks"]
) ++ get_in(
payload, ["msg", "opens"]
)
"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"], [])
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/
是否可以使用 & 符号编写参数化函数? 这是 Dave Thomas 的 Programming Elixir 书中的参数化函数示例 title = fn (title) -> ( fn (name)
Elixir编译器在函数的第三行给了我“未定义的函数更改/0”: def ignore_empty(changeset) do cond do %{valid?: false,
我是一名优秀的程序员,十分优秀!