
- Elixir 教程
- Elixir - 首頁
- Elixir - 概述
- Elixir - 環境
- Elixir - 基本語法
- Elixir - 資料型別
- Elixir - 變數
- Elixir - 運算子
- Elixir - 模式匹配
- Elixir - 決策
- Elixir - 字串
- Elixir - 字元列表
- Elixir - 列表和元組
- Elixir - 關鍵字列表
- Elixir - 對映
- Elixir - 模組
- Elixir - 別名
- Elixir - 函式
- Elixir - 遞迴
- Elixir - 迴圈
- Elixir - 可列舉
- Elixir - 流
- Elixir - 結構體
- Elixir - 協議
- Elixir - 檔案 I/O
- Elixir - 程序
- Elixir - 符號
- Elixir - 推導式
- Elixir - 型別規範
- Elixir - 行為
- Elixir - 錯誤處理
- Elixir - 宏
- Elixir - 庫
- Elixir 有用資源
- Elixir - 快速指南
- Elixir - 有用資源
- Elixir - 討論
Elixir - 列表和元組
(連結)列表
連結列表是儲存在記憶體中不同位置的元素的異構列表,並使用引用進行跟蹤。連結列表是函數語言程式設計中特別使用的的資料結構。
Elixir 使用方括號來指定值的列表。值可以是任何型別 -
[1, 2, true, 3]
當 Elixir 看到一個可列印的 ASCII 數字列表時,Elixir 會將其列印為字元列表(字面意思是一個字元列表)。無論何時在 IEx 中看到一個值並且不確定它是什麼,都可以使用i函式來檢索有關它的資訊。
IO.puts([104, 101, 108, 108, 111])
列表中的上述字元都是可列印的。當執行上述程式時,它會產生以下結果 -
hello
也可以使用單引號反向定義列表 -
IO.puts(is_list('Hello'))
當執行上述程式時,它會產生以下結果 -
true
請記住,在 Elixir 中,單引號和雙引號表示法並不等效,因為它們由不同的型別表示。
列表長度
要查詢列表的長度,我們使用 length 函式,如下面的程式所示 -
IO.puts(length([1, 2, :true, "str"]))
上述程式生成以下結果 -
4
連線和減法
可以使用++和--運算子連線和減去兩個列表。請考慮以下示例以瞭解這些函式。
IO.puts([1, 2, 3] ++ [4, 5, 6]) IO.puts([1, true, 2, false, 3, true] -- [true, false])
這將在第一種情況下為您提供連線的字串,在第二種情況下提供減去的字串。上述程式生成以下結果 -
[1, 2, 3, 4, 5, 6] [1, 2, 3, true]
列表的頭和尾
頭是列表的第一個元素,尾是列表的其餘部分。它們可以使用hd和tl函式檢索。讓我們將列表分配給一個變數並檢索其頭和尾。
list = [1, 2, 3] IO.puts(hd(list)) IO.puts(tl(list))
這將輸出列表的頭和尾。上述程式生成以下結果 -
1 [2, 3]
注意 - 獲取空列表的頭或尾是錯誤的。
其他列表函式
Elixir 標準庫提供了大量用於處理列表的函式。我們將在本文中介紹其中的一些。
序號 | 函式名稱和描述 |
---|---|
1 |
delete(list, item) 從列表中刪除給定的專案。返回不包含該專案的列表。如果該專案在列表中出現多次,則僅刪除第一次出現的專案。 |
2 |
delete_at(list, index) 透過刪除指定索引處的值來生成一個新列表。負索引表示從列表末尾的偏移量。如果索引超出範圍,則返回原始列表。 |
3 |
first(list) 返回列表中的第一個元素,如果列表為空則返回 nil。 |
4 |
flatten(list) 展平給定的巢狀列表列表。 |
5 |
insert_at(list, index, value) 返回一個在指定索引處插入值的列表。請注意,索引限制為列表長度。負索引表示從列表末尾的偏移量。 |
6 |
last(list) 返回列表中的最後一個元素,如果列表為空則返回 nil。 |
元組
元組也是資料結構,它們在其中儲存許多其他結構。與列表不同,它們將元素儲存在連續的記憶體塊中。這意味著按索引訪問元組元素或獲取元組大小是一個快速操作。索引從零開始。
Elixir 使用花括號定義元組。與列表一樣,元組可以儲存任何值 -
{:ok, "hello"}
元組長度
要獲取元組的長度,請使用tuple_size函式,如下面的程式所示 -
IO.puts(tuple_size({:ok, "hello"}))
上述程式生成以下結果 -
2
追加值
要將值追加到元組,請使用 Tuple.append 函式 -
tuple = {:ok, "Hello"} Tuple.append(tuple, :world)
這將建立並返回一個新的元組:{:ok, "Hello", :world}
插入值
要在給定位置插入值,可以使用Tuple.insert_at函式或put_elem函式。請考慮以下示例以瞭解相同內容 -
tuple = {:bar, :baz} new_tuple_1 = Tuple.insert_at(tuple, 0, :foo) new_tuple_2 = put_elem(tuple, 1, :foobar)
請注意,put_elem和insert_at返回了新的元組。儲存在 tuple 變數中的原始元組沒有被修改,因為 Elixir 資料型別是不可變的。透過不可變性,Elixir 程式碼更容易推理,因為您永遠不必擔心特定程式碼是否正在就地修改您的資料結構。
元組與列表
列表和元組有什麼區別?
列表在記憶體中以連結列表的形式儲存,這意味著列表中的每個元素都儲存其值並指向下一個元素,直到到達列表的末尾。我們將每對值和指標稱為 cons 單元格。這意味著訪問列表的長度是一個線性操作:我們需要遍歷整個列表才能確定其大小。更新列表很快,只要我們正在預先新增元素。
另一方面,元組在記憶體中連續儲存。這意味著透過索引獲取元組大小或訪問元素的速度很快。但是,更新或向元組新增元素代價很高,因為它需要在記憶體中複製整個元組。