Elixir 簡(jiǎn)明筆記(六)--- 元組

編程語(yǔ)言都有類(lèi)似集合的容器類(lèi)型怕膛。最典型的莫過(guò)于數(shù)組和哈希結(jié)構(gòu)庶溶。

通常數(shù)組是一些列有序元素的集合。有的語(yǔ)言的數(shù)組需要初始化大小垒棋,有的則是動(dòng)態(tài)變化卒煞。那些動(dòng)態(tài)變化的數(shù)組,在高級(jí)語(yǔ)言通常是列表叼架。當(dāng)然也有一些序列集合一旦創(chuàng)建了畔裕,就不能改變,這類(lèi)序列通常稱之為元組(tuple)乖订。

元組

Elixir中的元組是一組有序的數(shù)據(jù)集合扮饶。元組的項(xiàng)目元素可以是任意的Elixir數(shù)據(jù)類(lèi)型,元組還可以嵌套乍构。

元組使用花括號(hào)定義甜无,這個(gè)估計(jì)是Elixir特有,大多數(shù)語(yǔ)言如Python,Swift的元組都使用小括號(hào)岂丘。而使用花括號(hào)定義字典(python)或者對(duì)象(javascript)這樣的哈希結(jié)構(gòu)陵究。

實(shí)際上,Elixir的元組使用也類(lèi)似這樣的字典元潘。怎么說(shuō)呢畔乙,先看幾個(gè)元組的例子了:

iex(1)> {1, 2}
{1, 2}
iex(2)> {1, "2"}
{1, "2"}
iex(3)> {:ok, 42, "next", 'elixr'}
{:ok, 42, "next", 'elixr'}
iex(4)> {:error, :enoent}
{:error, :enoent}

可以看到,Elixir的元組很靈活翩概,可是,通常定義的元組都是2~4個(gè)元素返咱。這樣的定義钥庇,恰好和字典很像。例如這個(gè){:ok, "message"} 第一個(gè)元素是一個(gè)原子,第二個(gè)元素是一個(gè)字符串。之所以這樣定義集峦,是因?yàn)榫幊痰臅r(shí)候剿另,函數(shù)返回的可能不僅僅是一個(gè)值,而是好幾個(gè)值蔚龙,那么就可以把返回的好幾個(gè)值放入元組之中。返回的值又可以使用元組來(lái)做模式匹配。這樣一個(gè)單元的小對(duì)嗦枢,后面還可以用來(lái)組成關(guān)鍵字列表。

元組與模式匹配

我們知道屯断,凡是數(shù)據(jù)結(jié)構(gòu)一致文虏,就可以使用模式匹配。

iex(1)> {status, count, action} = {:ok, 42, "next"}
{:ok, 42, "next"}
iex(2)> status
:ok
iex(3)> count
42
iex(4)> action
"next"

正如上面提到殖演,可以把函數(shù)返回的多個(gè)值放入元組內(nèi)氧秘。通過(guò)元組的模式匹配獲得返回的值。例如文件的API操作:

iex(1)> {status, file} = File.open("hello.exs")
{:ok, #PID<0.60.0>}
iex(2)> {status, file} = File.open("nofile")
{:error, :enoent}

File模塊的open方法趴久,接受一個(gè)文件路徑作為參賽丸相,返回一個(gè)元組,元組的第一個(gè)元素為打開(kāi)文件的狀態(tài)彼棍。:ok表示打開(kāi)成功灭忠,:error則打開(kāi)失敗。第二個(gè)元素對(duì)于打開(kāi)成功的文件滥酥,返回一個(gè)文件資源的句柄更舞。

通過(guò)元組的模式匹配,很容易的就解包函數(shù)的返回值坎吻。

元組的基本操作

元組都有下標(biāo)索引缆蝉,索引從零開(kāi)始。可以借助函數(shù)elem通過(guò)索引訪問(wèn)元素刊头。

iex(5)> t
{:ok, 1, "hello", {1, 2}}
iex(6)> elem t, 1
1
iex(7)> elem t, 0
:ok

在Elixir中黍瞧,函數(shù)調(diào)用的小括號(hào)是可以省略的。elem t, 1等價(jià)于 elem(t, 1)原杂。

可以使用tuple_size 獲取元組的元素個(gè)數(shù)

iex(8)> tuple_size t
4

可以使用 put_elem “改變”元組元素的值印颤。

iex(9)> t
{:ok, 1, "hello", {1, 2}}
iex(10)> elem t, 2
"hello"
iex(11)> pelem t, 2
put_elem/3    put_in/2      put_in/3      pwd/0
iex(11)> put_elem t, 2, "hello world"
{:ok, 1, "hello world", {1, 2}}
iex(12)> t
{:ok, 1, "hello", {1, 2}}

注意這里的"改變"的含義。元組與其他Elixir數(shù)據(jù)結(jié)構(gòu)一樣穿肄,都是不可變的年局。這也是函數(shù)式語(yǔ)言的一大特性。put_elem 并沒(méi)有改變?cè)氐脑Mt咸产,而是返回了一個(gè)新的元組矢否,新的元組的第三個(gè)元素與舊的不一樣。

至于為什么這樣的更新而又不改變脑溢,如何理解Elixir中的不可變性呢僵朗?下一節(jié)我們?cè)賮?lái)探討。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屑彻,一起剝皮案震驚了整個(gè)濱河市验庙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌社牲,老刑警劉巖粪薛,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異膳沽,居然都是意外死亡汗菜,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)挑社,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)陨界,“玉大人,你說(shuō)我怎么就攤上這事痛阻【瘢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵阱当,是天一觀的道長(zhǎng)俏扩。 經(jīng)常有香客問(wèn)我,道長(zhǎng)弊添,這世上最難降的妖魔是什么录淡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮油坝,結(jié)果婚禮上嫉戚,老公的妹妹穿的比我還像新娘刨裆。我一直安慰自己,他們只是感情好彬檀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布帆啃。 她就那樣靜靜地躺著,像睡著了一般窍帝。 火紅的嫁衣襯著肌膚如雪努潘。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,775評(píng)論 1 307
  • 那天坤学,我揣著相機(jī)與錄音疯坤,去河邊找鬼。 笑死拥峦,一個(gè)胖子當(dāng)著我的面吹牛贴膘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播略号,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼洋闽!你這毒婦竟也來(lái)了玄柠?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤诫舅,失蹤者是張志新(化名)和其女友劉穎羽利,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體刊懈,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡这弧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了虚汛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匾浪。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖卷哩,靈堂內(nèi)的尸體忽然破棺而出蛋辈,到底是詐尸還是另有隱情,我是刑警寧澤将谊,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布冷溶,位于F島的核電站,受9級(jí)特大地震影響尊浓,放射性物質(zhì)發(fā)生泄漏逞频。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一栋齿、第九天 我趴在偏房一處隱蔽的房頂上張望苗胀。 院中可真熱鬧襟诸,春花似錦、人聲如沸柒巫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)堡掏。三九已至应结,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泉唁,已是汗流浹背鹅龄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亭畜,地道東北人扮休。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拴鸵,于是被迫代替她去往敵國(guó)和親玷坠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容