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)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。