Elixir 代码示例 2: Map

转换为关键字列表

iex(32)> Map.to_list(%{one: 1, two: 2})
[one: 1, two: 2]

转换为结构

通过一个Map来构造一个Struct

# 首先定义结构
defmodule User do
  defstruct username: nil, mail: nil
end

# 其次调用`Kernal.struct/2`构造一个结构
struct(User, %{
    name: "segmentfault", 
    mail: "[email protected]"
})

模式匹配

iex(7)> %{name: name, mail: mail} = %{name: "segmentfault", mail: "[email protected]"}
%{mail: "[email protected]", name: "segmentfault"}

iex(8)> name
"segmentfault"

iex(9)> mail
"[email protected]"

匹配不存在的key

iex(10)> %{name: name, tel: tel} = %{name: "segmentfault", mail: "[email protected]"}  
** (MatchError) no match of right hand side value: %{mail: "[email protected]", name: "segmentfault"}

Map 语法

# 空Map
%{}

# Map箭头语法
%{"name" => "segmentfault", "mail" => "[email protected]"}

# 当所有key为原子的简写形式
# 注意冒号后面一定要有一个空格
%{name: "segmentfault", mail: "[email protected]"}

计算一个Map的大小

iex(10)> map = %{name: "segmentfault", mail: "[email protected]"}                      
%{mail: "[email protected]", name: "segmentfault"}
iex(11)> map_size(map)
2

参考: Kernel.map_size/1

更新一个Map的值

iex(16)> map = %{name: "segmentfault", mail: "[email protected]"}
%{mail: "[email protected]", name: "segmentfault"}

iex(17)> %{map | name: "new"}                                                                        
%{mail: "[email protected]", name: "new"}

你可能感兴趣的:(elixir)