學(xué)習(xí)一門語言,如何才能算是學(xué)會(huì)呢?如同寫一篇文章,最簡(jiǎn)單的就是得先學(xué)會(huì)如何遣詞造句。文章的詞組,就像編程語言的基本數(shù)據(jù)結(jié)構(gòu)。
編程的本質(zhì)是數(shù)據(jù)結(jié)構(gòu)加算法。想要使用Elixir編程,當(dāng)然少不了它的數(shù)據(jù)結(jié)構(gòu)。所幸Elixir提供了豐富的數(shù)據(jù)結(jié)構(gòu)。其基本的數(shù)據(jù)結(jié)構(gòu)大致可分為值類型,系統(tǒng)類型和容器類型:
-
值類型
- 數(shù)字(Number)
- 整型(Integer)
- 浮點(diǎn)類型(Float)
- 原子(Atom)
- 范圍(Range)
- 正則表達(dá)式(Regular expressions)
- 數(shù)字(Number)
-
系統(tǒng)類型:
- 進(jìn)程(PID)和 端口(port)
- 引用(References)
-
容器類型
- 元組(Tuple)
- 列表(List)
- 圖(Map)
- 二進(jìn)制 (Binary)
數(shù)字類型
數(shù)字類型包括整型和浮點(diǎn)型,與其他編程語言類似,它們也沒有特別之處。Elixir中可以直接書寫它們。當(dāng)然,我們很熟悉書寫十進(jìn)制的數(shù)字。對(duì)于八進(jìn)制,十六進(jìn)制,Elixir也支持字面量書寫的方式。
iex(1)> n = 10
10
iex(2)> n = 0x10
16
iex(3)> n = 0o10
8
使用0x前綴寫十六進(jìn)制的數(shù)字,使用0o前綴定義八進(jìn)制的數(shù)字。對(duì)于十進(jìn)制,還可以使用_符號(hào)來對(duì)數(shù)字分組閱讀,例如:
iex(1)> n = 1000000
1000000
iex(2)> a = 1_000_000
1000000
iex(3)> n = a
1000000
iex(4)> n == a
true
可見 n 和 a 的值相等,不然a=n的模式匹配則會(huì)失敗,正好復(fù)習(xí)一下模式匹配,==則是邏輯運(yùn)算符,后面再做介紹了。
需要注意的是Elixir的整型的大小是沒有限制的。數(shù)字類型中的另外一種則是浮點(diǎn)類型,Elixir的浮點(diǎn)類型符合IEEE 754 雙進(jìn)度標(biāo)準(zhǔn)??梢员WC16位精確。
原子類型
原子(Atoms)的定義使用一個(gè)冒號(hào)加上任意Elixir字符(非數(shù)字開頭, 非.)。
原子和Lisp或者Ruby的符號(hào)類型類似。其值就是原子名本身。下面看幾個(gè)例子:
iex(1)> :hello
:hello
iex(2)> :rsj217
:rsj217
iex(3)> :do_you_love_me?
:do_you_love_me?
iex(4)> :yes!
:yes!
iex(5)> :"Thank God"
:"Thank God"
iex(6)> :123
** (SyntaxError) iex:6: invalid token: :123
iex(6)> :123A
** (SyntaxError) iex:6: invalid token: :123A
兩個(gè)同名的原子其值總是相等。即使他們是被不同的程序、不同的計(jì)算機(jī)哪跨洋創(chuàng)建的。原子很有用,通常用于當(dāng)tag的值。
原子類型很常見,最常見的一類莫過于布爾類型。Elixir中的布爾值只有兩個(gè),分別是true表示邏輯真,用false用來表示邏輯非。布爾類型的值就是其本身,即true的值是true,false的值是false,對(duì)吧,這就是原子。
iex(1)> true
true
iex(2)> :true
true
iex(3)> a = true
true
iex(4)> b = :true
true
iex(5)> a = b
true
iex(6)> a == b
true
iex(7)>
范圍
范圍(range)是一類數(shù)字或者字母的值,表示一個(gè)范圍,使用起始值..終止值定義。例如:
iex(1)> r = 0..9
0..9
范圍可以用于迭代。
正則表達(dá)式
也許把范圍和正則表達(dá)歸結(jié)為值類型欠妥。實(shí)際上他們確實(shí)不是值類型,只是一種結(jié)構(gòu)。只不過,把他們看成值類型,現(xiàn)在比較好理解。
正則表達(dá)式通常用于處理文本。Elixir中當(dāng)然也有字符串(String)類型,可是為何沒有出現(xiàn)在上面的介紹中呢?實(shí)際上,字符串不是基本類型,他們是由基本類型復(fù)合構(gòu)成的,伴隨更深了的了解Elixir,再對(duì)正則和字符串進(jìn)行介紹。
系統(tǒng)類型
Elixir是運(yùn)行在Erlang虛擬機(jī)上的語言。其中并發(fā)能力主要來自Elixir可以開啟成千上萬給進(jìn)程。這些進(jìn)程之間通過消息通信。進(jìn)程(PID)和端口(Port)這兩個(gè)系統(tǒng)類型則是用于處理Elixir進(jìn)程所用的基本數(shù)據(jù)類型。關(guān)于他們的介紹,等學(xué)到了Elixir進(jìn)程相關(guān)的知識(shí)再做介紹。
引用(References)也是一種系統(tǒng)類型,目前還沒搞明白。
容器類型
容器類型是Elixir中最常用的類型。常見的元組(Tuple)和列表(List)和圖(Map)以及二進(jìn)制 (Binary)。這些內(nèi)容將會(huì)下一節(jié)介紹。