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 中的字符列表時獲得它們的簡明概要,它會在一個摘要中向您顯示類型、說明以及原始表示。IEx.Helpers.i/1
這種行為背後的基本原理是更好地支持 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 字符組成,則可以檢查該列表。ascii_printable?/2
不正確的列表永遠不會被視為charlists。
相關用法
- Elixir List.keyfind!用法及代碼示例
- Elixir List.keystore用法及代碼示例
- Elixir List.to_float用法及代碼示例
- Elixir List.to_string用法及代碼示例
- Elixir List.myers_difference用法及代碼示例
- Elixir List.starts_with?用法及代碼示例
- Elixir List.to_charlist用法及代碼示例
- Elixir List.insert_at用法及代碼示例
- Elixir List.keymember?用法及代碼示例
- Elixir List.to_tuple用法及代碼示例
- Elixir List.to_atom用法及代碼示例
- Elixir List.delete_at用法及代碼示例
- Elixir List.replace_at用法及代碼示例
- Elixir List.first用法及代碼示例
- Elixir List.keyreplace用法及代碼示例
- Elixir List.keysort用法及代碼示例
- Elixir List.ascii_printable?用法及代碼示例
- Elixir List.zip用法及代碼示例
- Elixir List.last用法及代碼示例
- Elixir List.to_integer用法及代碼示例
- Elixir List.foldl用法及代碼示例
- Elixir List.improper?用法及代碼示例
- Elixir List.foldr用法及代碼示例
- Elixir List.delete用法及代碼示例
- Elixir List.to_existing_atom用法及代碼示例
注:本文由純淨天空篩選整理自elixir-lang.org大神的英文原創作品 List。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。