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


Elixir Access用法及代码示例


Elixir语言中 Access 相关用法介绍如下。

基于键的数据结构访问。

Access 模块定义了一种行为,用于通过 data[key] 语法动态访问数据结构中任何类型的键。

Access 支持开箱即用的关键字列表 ( Keyword ) 和Map ( Map )。关键字仅支持原子键,映射的键可以是任何类型。如果 key 不存在,两者都返回nil

iex> keywords = [a: 1, b: 2]
iex> keywords[:a]
1
iex> keywords[:c]
nil

iex> map = %{a: 1, b: 2}
iex> map[:a]
1

iex> star_ratings = %{1.0 => "★", 1.5 => "★☆", 2.0 => "★★"}
iex> star_ratings[1.5]
"★☆"

这种语法非常方便,因为它可以任意嵌套:

iex> keywords = [a: 1, b: 2]
iex> keywords[:c][:unknown]
nil

这是有效的,因为访问 nil 值上的任何内容都会返回 nil 本身:

iex> nil[:a]
nil

访问语法也可以与 Kernel.put_in/2 Kernel.update_in/2 Kernel.get_and_update_in/2 宏一起使用,以允许在嵌套数据结构中设置值:

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

注意力!虽然通过 map[key] 在映射中允许访问语法,但如果您的映射由预定义的原子键组成,您应该更喜欢使用 map.key 而不是 map[key] 访问这些原子键,因为如果键会引发 map.key丢失(如果键是预定义的,则不应该发生这种情况)。同样,由于结构是映射并且结构具有预定义的键,因此它们只允许 struct.key 语法,并且不允许 struct[key] 访问语法。有关详细信息,请参阅 Map 模块。

嵌套数据结构

这两种基于键的访问语法都可以与 Kernel 中的嵌套更新函数和宏一起使用,例如 Kernel.get_in/2 Kernel.put_in/3 Kernel.update_in/3 Kernel.pop_in/2 Kernel.get_and_update_in/3

例如,要更新另一个Map中的Map:

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

该模块提供了用于遍历其他结构(如元组和列表)的便利函数。这些函数可用于所有与 Access 相关的函数和 Kernel 中的宏。

例如,给定一个带有 :name:languages 键的用户映射,下面是如何深入遍历映射并将所有语言名称转换为大写:

iex> languages = [
...>   %{name: "elixir", type: :functional},
...>   %{name: "c", type: :procedural}
...> ]
iex> user = %{name: "john", languages: languages}
iex> update_in(user, [:languages, Access.all(), :name], &String.upcase/1)
%{
  name: "john",
  languages: [
    %{name: "ELIXIR", type: :functional},
    %{name: "C", type: :procedural}
  ]
}

请参阅函数 key/1 key!/1 elem/1 all/0 以了解一些可用的访问器。

相关用法


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