当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Elixir Kernel.get_in用法及代码示例


Elixir语言中 Kernel.get_in 相关用法介绍如下。

用法:

get_in(data, keys)
@spec get_in(Access.t(), [term(), ...]) :: term()

从嵌套结构中获取值。

使用 Access 模块根据给定的 keys 遍历结构,除非 key 是一个函数,这将在后面的部分中详细介绍。

例子

iex> users = %{"john" => %{age: 27}, "meg" => %{age: 23}}
iex> get_in(users, ["john", :age])
27

get_in/2 还可以使用 Access 模块中的访问器来遍历更复杂的数据结构。例如,这里我们使用 Access.all/0 来遍历一个列表:

iex> users = [%{name: "john", age: 27}, %{name: "meg", age: 23}]
iex> get_in(users, [Access.all(), :age])
[27, 23]

如果任何组件返回 nil ,将返回 nil 并且 get_in/2 将不再遍历:

iex> users = %{"john" => %{age: 27}, "meg" => %{age: 23}}
iex> get_in(users, ["unknown", :age])
nil

iex> users = nil
iex> get_in(users, [Access.all(), :age])
nil

get_in/2 的主要特点正是它在找到nil 值时中止遍历。除非您需要nil-safety,否则编写"regular" Elixir 代码可能会更好:

iex> users = %{"john" => %{age: 27}, "meg" => %{age: 23}}
iex> users["john"][:age]
27

iex> users = [%{name: "john", age: 27}, %{name: "meg", age: 23}]
iex> Enum.map(users, fn user -> user[:age] end)
[27, 23]

或者,如果您需要访问复杂的data-structures,您可以使用模式匹配:

case users do
  %{"john" => %{age: age}} -> age
  _ -> default_value
end

作为键的函数

如果给 get_in/2 的键是一个函数,该函数将被调用并传递三个参数:

  • 操作(:get)
  • 要访问的数据
  • 接下来要调用的函数

这意味着可以扩展 get_in/2 以提供自定义查找。这正是上一节中 Access.all/0 键的行为方式。例如,我们可以手动实现这样的遍历,如下所示:

iex> users = [%{name: "john", age: 27}, %{name: "meg", age: 23}]
iex> all = fn :get, data, next -> Enum.map(data, next) end
iex> get_in(users, [all, :age])
[27, 23]

Access 模块附带许多便利访问器函数。请参阅 Access.all/0 Access.key/2 和其他示例。

使用结构

默认情况下,结构不实现此函数所需的 Access 行为。因此,您不能这样做:

get_in(some_struct, [:some_key, :nested_key])

好消息是结构具有预定义的形状。因此,您可以改为:

some_struct.some_key.nested_key

如果有任何机会,some_key 可以返回 nil,您始终可以回退到模式匹配以提供嵌套结构处理:

case some_struct do
  %{some_key: %{nested_key: value}} -> value
  %{} -> nil
end

相关用法


注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 Kernel.get_in(data, keys)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。