Elixir 列表還是元組?

2023-12-14 16:22 更新

列表和元組的區(qū)別是什么?

列表以連接表的形式在內(nèi)存中存儲,即列表中的每個元素包含了它的值和指向下一個元素的指針,直到列表的盡頭。我們把每對值和指針稱為一個驛站(cons cell):

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

這意味著訪問一個列表的長度是一個線性操作:我們需要貫穿整個列表來算出它的長度。更新一個列表只需要在它前面加上元素:

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

而元組,是以連續(xù)的方式存儲在內(nèi)存中的。這意味著獲得元組長度或通過坐標(biāo)訪問元素都很快。然而,更新或添加元素卻很復(fù)雜,因為必須復(fù)制整個元組。

不同的性能特點決定了這些數(shù)據(jù)結(jié)構(gòu)的用途。元組常用于返回函數(shù)的額外信息。例如,是一個用于讀取文件內(nèi)容的函數(shù),它返回了一個元組:?File.read/1?

iex> File.read("path/to/existing/file")
{:ok, "... contents ..."}
iex> File.read("path/to/unknown/file")
{:error, :anoint}

如果提供給的路徑存在,那么它返回了一個元組,由原子作為第一個元素,文件內(nèi)容作為第二個。否則,返回的元組會包含和錯誤描述。?File.read/1??:ok??:error?

大多數(shù)時候,Elixir會引導(dǎo)你做正確的事。例如,函數(shù)可以訪問元組,但是對于列表卻沒有定義相似的函數(shù):?elem/2?

iex> tuple = {:ok, "hello"}
{:ok, "hello"}
iex> elem(tuple, 1)
"hello"

當(dāng)"計算"一個數(shù)據(jù)結(jié)構(gòu)中元素數(shù)量時,Elixir也制定了一條簡單的規(guī)則:如果操作時間是固定的(例如,值是計算好的),則函數(shù)被命名為大??;若操作時間是線性的(例如,計算長度的時間隨著輸入的增長而變長),則函數(shù)被命名為長度。?size??length?

例如,我們已經(jīng)學(xué)習(xí)了4個計量函數(shù):(字符串中的字節(jié)數(shù)),(元組大小),(列表長度)以及(字符串中的字素數(shù))。這說明,我們使用來獲取字符串的字節(jié)數(shù)是廉價的,但用來得到字符串中unicode字符的數(shù)量就需要貫穿整個字符串。?byte_size/1??tuple_size/1??length/1??String.length/1??byte_size??String.length?

Elixir也提供了,和作為數(shù)據(jù)類型(通常用于進(jìn)程通信),當(dāng)講到進(jìn)程時我們會簡單地介紹它們?,F(xiàn)在,讓我們看一些對于基本類型的基本操作。?Port??Reference??PID?


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號