Elixir 列表

列表 是由多个数据组成的一个集合。有点像数组,但是内部不是像数组那样使用连续内存存储数据,而是使用链表来存储数据。

你是在分不清,那就和我刚开始的时候一样吧,死记硬背就好了。

Elixir 使用方括号 [] 来指定一个值列表。值可以是任何类型。

iex(38)> [1,2,3]
[1, 2, 3]
iex(39)> [1,2.0,true,"hello",:world]
[1, 2.0, true, "hello", :world]

你可能有疑惑,为啥一组数字里放了个 true 进去。对的,这里没有强制要求必须是同一种数据类型。 反正是东西都能往里面塞,人家唯一的要求就是 一对中括号

列表的长度

Elixir 提供了 length/1 函数用于求取列表的长度,也就是获取列表元素的个数。

iex> length([1,2,3])
3
iex> length([1,2.0,true,"hello",:world])
5

拼接列表

Elixir 提供了 ++/2 运算符用于拼接两个列表,拼接的意思,就是把后面的列表的参数放到第一个列表尾部

iex> [1] ++ [2,3] 
[1, 2, 3]
iex> [] ++ [2,3]
[2, 3]
iex> [2,3] ++ []
[2, 3]
iex> [1,2,3] ++ [1,2,4]
[1, 2, 3, 1, 2, 4]

减去列表

Elixir 提供了 --/2 运算符用于减去一个列表,也就是将第二个列表中的元素,一对一的消除第一个列表中的相同的元素。 如果第二个列表中某个元素在第一个列表中不存在,则忽略。

iex> [1,2,3] ++ [1,2,4]
[1, 2, 3, 1, 2, 4]
iex> [1,2,3] -- [4,5,6]
[1, 2, 3]
iex> [1,2,3] -- [3,3,3]
[1, 2]
iex> [1,2,2,3] -- [2]
[1, 2, 3]

注意: 最后一个范例,一对一的意思,就是玩 连连看 消除一样。

列表不可变性

Exilir 基于 Erlang 而来,自然继承了 Erlang 的不可变性。 列表不可变的意思,就是 列表从定义那时起,就不能改变元素的内容,也不能改变列表的长度

所以,列表操作符从来不改变现有列表,所有的操作符都是返回一个新的列表。

iex> a = [1,2,2,3]
[1, 2, 2, 3]
iex> b = [2] 
[2]
iex> c = a -- b
[1, 2, 3]
iex> a
[1, 2, 2, 3]
iex> b
[2]
iex> c
[1, 2, 3]

head 和 tail

接下来的教程中,我们会更详细的讨论列表相关的内容。尤其是 headtail 的概念。

举个例子,对于列表 [1,2,2,3]

  1. head 是头是列表的第一个元素,在 [1,2,2,3] 范例中指的是 1 这个元素
  2. tail 是尾部是列表的其余部分,在 [1,2,2,3] 范例中,指的是 [2,2,3] 这个列表。

Elixir 提供了 hd/1 获取列表的 head

iex> hd([1,2,2,3]) 
1

如果一个列表为空,则 hd/1 函数会引发错误。

iex> hd([])
** (ArgumentError) errors were found at the given arguments:

  * 1st argument: not a nonempty list

    :erlang.hd([])

Elixir 还提供了 tl/1 函数用于返回一个列表的尾部

iex> tl([1,2,3])
[2, 3]

如果一个列表为空,则 td/1 函数会引发错误。

iex> tl([])
** (ArgumentError) errors were found at the given arguments:

  * 1st argument: not a nonempty list

    :erlang.tl([])

单引号字符串

在前面的字符串教程里,我们尝试了 '简单教程' 这种单引号围起来的字符串,没想道返回下面的结果

iex> '简单教程'
[31616, 21333, 25945, 31243]

有时你会创建一个列表,它将返回一个单引号的值

iex> [11, 12, 13]
'\v\f\r'
iex> [104, 101, 108, 108, 111]
'hello'

但如果你尝试下面这个,则又没发生

iex> [31616, 21333, 25945, 31243]
[31616, 21333, 25945, 31243]

为什么会这样呢?

当 Elixir 看到可打印的 ASCII 码 列表时,Elixir 将把它打印为 charlist(字面上是一个字符列表)。

无论何时您在 iex 中看到一个值,并且你不确定它是什么,您都可以使用它 i/1 来检索有关它的信息

iex> i'简单教程'
Term
  [31616, 21333, 25945, 31243]
Data type
  List
Reference modules
  List
Implemented protocols
  Collectable, Enumerable, IEx.Info, Inspect, List.Chars, String.Chars

字符列表

请记住:Elixir 中的单引号和双引号表示不同,因为它们由不同类型表示

在 Elixir 中,单引号围起来的字符串是 字符串列表,双引号围起来的才是 字符串

我们将会在后面的章节中详细介绍这种不同。

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.