當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Elixir List用法及代碼示例


Elixir語言中 List 相關用法介紹如下。

鏈表按選定的順序保存零個、一個或多個元素。

Elixir 中的列表在方括號之間指定:

iex> [1, "two", 3, :four]
[1, "two", 3, :four]

可以使用 Kernel.++/2 Kernel.--/2 運算符連接和減去兩個列表:

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

可以使用 | 將元素添加到列表中:

iex> new = 0
iex> list = [1, 2, 3]
iex> [new | list]
[0, 1, 2, 3]

Elixir 中的列表是有效的鏈表,這意味著它們在內部成對表示,包含列表的頭部和尾部:

iex> [head | tail] = [1, 2, 3]
iex> head
1
iex> tail
[2, 3]

類似地,我們可以僅使用這樣的對(稱為 cons 單元格)編寫列表 [1, 2, 3]

iex> [1 | [2 | [3 | []]]]
[1, 2, 3]

一些列表,稱為不正確的列表,沒有一個空列表作為最後一個 cons 單元格中的第二個元素:

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

盡管通常會避免不正確的列表,但它們會在一些特殊情況下使用,例如 iodata 和 chardata 實體(請參閱 IO 模塊)。

由於它們基於單元格的表示,將元素添加到列表總是很快(恒定時間),而隨著列表大小的增長(線性時間),追加變得更慢:

iex> list = [1, 2, 3]
iex> [0 | list] # fast
[0, 1, 2, 3]
iex> list ++ [4] # slow
[1, 2, 3, 4]

該模塊中的大多數函數都在線性時間內工作。這意味著,執行操作所需的時間以與列表長度相同的速度增長。例如 length/1 last/1 將在線性時間運行,因為它們需要遍曆列表的每個元素,但 first/1 將在恒定時間運行,因為它隻需要第一個元素。

列表還實現了 Enumerable 協議,因此在 Enum 模塊中可以找到許多與列表一起使用的函數。此外,在 Kernel 中還可以找到以下列表的函數和運算符:

名人錄

如果列表由非負整數組成,其中每個整數代表一個 Unicode 代碼點,則該列表也可以稱為 charlist。這些整數必須:

  • 0..0x10FFFF (0..1_114_111) 範圍內;
  • 並且超出範圍 0xD800..0xDFFF ( 55_296..57_343 ),該範圍在 Unicode 中為 UTF-16 代理對保留。

Elixir 使用單引號來定義字符列表:

iex> 'héllo'
[104, 233, 108, 108, 111]

特別是,如果字符列表僅包含可打印的 ASCII 字符,則默認情況下將用單引號將其打印返回:

iex> 'abc'
'abc'

即使表示發生了變化,原始數據仍然是一個數字列表,可以這樣處理:

iex> inspect('abc', charlists: :as_list)
"[97, 98, 99]"
iex> Enum.map('abc', fn num -> 1000 + num end)
[1097, 1098, 1099]

您可以使用 IEx.Helpers.i/1 助手在您遇到 IEx 中的字符列表時獲得它們的簡明概要,它會在一個摘要中向您顯示類型、說明以及原始表示。

這種行為背後的基本原理是更好地支持 Erlang 庫,這些庫可以將文本作為字符列表而不是 Elixir 字符串返回。在 Erlang 中,charlists 是處理字符串的默認方式,而在 Elixir 中則是二進製文件。此類函數的一個示例是 Application.loaded_applications/0

Application.loaded_applications()
#=>  [
#=>    {:stdlib, 'ERTS  CXC 138 10', '2.6'},
#=>    {:compiler, 'ERTS  CXC 138 10', '6.0.1'},
#=>    {:elixir, 'elixir', '1.0.0'},
#=>    {:kernel, 'ERTS  CXC 138 10', '4.1'},
#=>    {:logger, 'logger', '1.0.0'}
#=>  ]

如果列表僅由帶有 ascii_printable?/2 的可打印 ASCII 字符組成,則可以檢查該列表。

不正確的列表永遠不會被視為charlists。

相關用法


注:本文由純淨天空篩選整理自elixir-lang.org大神的英文原創作品 List。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。