List
List的语法是: [ ],中括号里的值可以是任何类型
Elixir 里所有的数据结构都是 immutable 不可变的,对list进行任何操作都会返回一个新的list。
keyword lists 是一种关联数据结构,关联数据结构的意思就是一个key对应一个确定的值。在elixir中有2种关联数据结构,一种是keyword list一种是maps,我们今天线看keyword list。
- keyword list的语法, [{:a, 1}, {:b, 2}] == [a: 1, b: 2],等式左右2种书写方式不能混写。
iex(32)> [{:trim, true}] [trim: true] iex(33)> [{:trim, :a}] # 当key为atom是,2个表达式相等[{:trim, :a}] = [trim: :a] [trim: :a] iex(34)>
- 获取keyword list的值
iex(46)> list = [a: 1, b: 2] [a: 1, b: 2] iex(47)> list[a] # 错误的获取方式 ** (CompileError) iex:47: undefined function a/0 (there is no such import) iex(47)> list[:a] # 正确的获取方式 1 iex(48)>
- keyword list中有重复的key,我们获取时候只能获取到list前面的
iex(46)> list = [a: 1, b: 2] [a: 1, b: 2] iex(47)> list[:a] 1 iex(48)> new_list = [a: 0] ++ list [a: 0, a: 1, b: 2] iex(49)> new_list[:a] 0 iex(50)>
- keyworl list 的三个特点:
- key必须是atom
- key可以排序
- 同一个key在list中可以出现多次,赋值多次
Function
length/1
方法,返回list长度;++/2
and--/2
iex(28)> [1, 2, 3, :a] ++ [:b, true] [1, 2, 3, :a, :b, true] iex(29)> [1, 2, 3, :a] ++ [:b, true, nil] [1, 2, 3, :a, :b, true, nil] iex(33)> length([1, 2, 3, :a] -- [1]) 3
hd/1
andtl/1
: hd(head)获取list的第一个元素,tl(tail)获取list的除第一个元素外的其他元素;注意⚠️:如果获取[]空list的head和tail会返回错误iex(35)> list = [1, 2, 3, 4] [1, 2, 3, 4] iex(36)> hd list 1 iex(37)> tl list [2, 3, 4] iex(38)> hd([]) ** (ArgumentError) errors were found at the given arguments: * 1st argument: not a nonempty list :erlang.hd([]) iex(38)>
- 模式匹配,可通过
[head | tail] = [1, 2, 3]
,完成hd/1,tl/1的功能,[head | tail]
还可以给list添加元素- [head | tail] 获取元素,[head | _] 使用_代替tail,忽略tail匹配
iex(12)> list = [1, 2, 3] [1, 2, 3] iex(13)> [head | tail] = list [1, 2, 3] iex(14)> head 1 iex(15)> tail [2, 3] iex(16)> [head | _] = list [1, 2, 3] iex(17)> head 1 iex(18)> _ ** (CompileError) iex:18: invalid use of _. "_" represents a value to be ignored in a pattern and cannot be used in expressions iex(18)>
- [head | tail] 完成list的数据更新
iex(9)> list = [1, 2, 3] [1, 2, 3] iex(10)> [0 | list] [0, 1, 2, 3] iex(11)> list [1, 2, 3] iex(12)> hd [0 | list] 0 iex(13)> tl [0 | list] [1, 2, 3] iex(14)> # list 作为head创建新的list iex(15)> [list | :a] [[1, 2, 3] | :a] iex(16)> hd [list | :a] [1, 2, 3] iex(17)>
- 在某些特定的情况下,一组list的值会返回一个charlist(literally a list of characters); 当list全部为数字时,且list的元素为 ASCII 码时,Elixir将把list打印成charlist(一个被单引号打包的字符)。(!!此处的理解不是很到位)
注意⚠️:iex(65)> [108, 97, 110] 'lan' iex(66)>
''
单引号表示数据格式为charlist,""
双引号表示数据格式为string