W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
列表和元組的區(qū)別是什么?
列表以連接表的形式在內(nèi)存中存儲(chǔ),即列表中的每個(gè)元素包含了它的值和指向下一個(gè)元素的指針,直到列表的盡頭。我們把每對(duì)值和指針稱為一個(gè)驛站(cons cell):
iex> list = [1 | [2 | [3 | []]]]
[1, 2, 3]
這意味著訪問一個(gè)列表的長度是一個(gè)線性操作:我們需要貫穿整個(gè)列表來算出它的長度。更新一個(gè)列表只需要在它前面加上元素:
iex> [0 | list]
[0, 1, 2, 3]
而元組,是以連續(xù)的方式存儲(chǔ)在內(nèi)存中的。這意味著獲得元組長度或通過坐標(biāo)訪問元素都很快。然而,更新或添加元素卻很復(fù)雜,因?yàn)楸仨殢?fù)制整個(gè)元組。
不同的性能特點(diǎn)決定了這些數(shù)據(jù)結(jié)構(gòu)的用途。元組常用于返回函數(shù)的額外信息。例如,是一個(gè)用于讀取文件內(nèi)容的函數(shù),它返回了一個(gè)元組:?File.read/1
?
iex> File.read("path/to/existing/file")
{:ok, "... contents ..."}
iex> File.read("path/to/unknown/file")
{:error, :anoint}
如果提供給的路徑存在,那么它返回了一個(gè)元組,由原子作為第一個(gè)元素,文件內(nèi)容作為第二個(gè)。否則,返回的元組會(huì)包含和錯(cuò)誤描述。?File.read/1
??:ok
??:error
?
大多數(shù)時(shí)候,Elixir會(huì)引導(dǎo)你做正確的事。例如,函數(shù)可以訪問元組,但是對(duì)于列表卻沒有定義相似的函數(shù):?elem/2
?
iex> tuple = {:ok, "hello"}
{:ok, "hello"}
iex> elem(tuple, 1)
"hello"
當(dāng)"計(jì)算"一個(gè)數(shù)據(jù)結(jié)構(gòu)中元素?cái)?shù)量時(shí),Elixir也制定了一條簡單的規(guī)則:如果操作時(shí)間是固定的(例如,值是計(jì)算好的),則函數(shù)被命名為大?。蝗舨僮鲿r(shí)間是線性的(例如,計(jì)算長度的時(shí)間隨著輸入的增長而變長),則函數(shù)被命名為長度。?size
??length
?
例如,我們已經(jīng)學(xué)習(xí)了4個(gè)計(jì)量函數(shù):(字符串中的字節(jié)數(shù)),(元組大小),(列表長度)以及(字符串中的字素?cái)?shù))。這說明,我們使用來獲取字符串的字節(jié)數(shù)是廉價(jià)的,但用來得到字符串中unicode字符的數(shù)量就需要貫穿整個(gè)字符串。?byte_size/1
??tuple_size/1
??length/1
??String.length/1
??byte_size
??String.length
?
Elixir也提供了,和作為數(shù)據(jù)類型(通常用于進(jìn)程通信),當(dāng)講到進(jìn)程時(shí)我們會(huì)簡單地介紹它們?,F(xiàn)在,讓我們看一些對(duì)于基本類型的基本操作。?Port
??Reference
??PID
?
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: