當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


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