Elixir语言中 Access
相关用法介绍如下。
基于键的数据结构访问。
模块定义了一种行为,用于通过 Access
data[key]
语法动态访问数据结构中任何类型的键。
支持开箱即用的关键字列表 (Access
) 和Map (Keyword
)。关键字仅支持原子键,映射的键可以是任何类型。如果 key 不存在,两者都返回Map
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}
]
}
相关用法
- Elixir Access.filter用法及代码示例
- Elixir Access.all用法及代码示例
- Elixir Access.key用法及代码示例
- Elixir Access.get用法及代码示例
- Elixir Access.key!用法及代码示例
- Elixir Access.fetch用法及代码示例
- Elixir Access.at!用法及代码示例
- Elixir Access.at用法及代码示例
- Elixir Access.fetch!用法及代码示例
- Elixir Access.elem用法及代码示例
- Elixir Access.pop用法及代码示例
- Elixir Access.get_and_update用法及代码示例
- Elixir Application.get_env用法及代码示例
- Elixir Application用法及代码示例
- Elixir Agent.get_and_update用法及代码示例
- Elixir Atom用法及代码示例
- Elixir Atom.to_string用法及代码示例
- Elixir Agent.get用法及代码示例
- Elixir Atom.to_charlist用法及代码示例
- Elixir Agent.cast用法及代码示例
- Elixir Agent.start_link用法及代码示例
- Elixir Agent.update用法及代码示例
- Elixir Agent.stop用法及代码示例
- Elixir Application.ensure_started用法及代码示例
- Elixir Agent.start用法及代码示例
注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 Access。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。