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 Kernel.get_and_update_in用法及代码示例
- Elixir Kernel.SpecialForms.case用法及代码示例
- Elixir Kernel.round用法及代码示例
- Elixir Kernel.left / right用法及代码示例
- Elixir Kernel.put_in用法及代码示例
- Elixir Kernel.tl用法及代码示例
- Elixir Kernel.left - right用法及代码示例
- Elixir Kernel.tuple_size用法及代码示例
- Elixir Kernel.defexception用法及代码示例
- Elixir Kernel.to_charlist用法及代码示例
- Elixir Kernel.base ** exponent用法及代码示例
- Elixir Kernel.left !== right用法及代码示例
- Elixir Kernel.if用法及代码示例
- Elixir Kernel.spawn_monitor用法及代码示例
- Elixir Kernel.to_string用法及代码示例
- Elixir Kernel.length用法及代码示例
- Elixir Kernel.first..last用法及代码示例
- Elixir Kernel.SpecialForms.%{}用法及代码示例
- Elixir Kernel.SpecialForms.for用法及代码示例
- Elixir Kernel.then用法及代码示例
- Elixir Kernel.spawn用法及代码示例
- Elixir Kernel.defmodule用法及代码示例
- Elixir Kernel.SpecialForms.quote用法及代码示例
- Elixir Kernel.left > right用法及代码示例
- Elixir Kernel.binding用法及代码示例
注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 Kernel.get_in(data, keys)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。