Elixir雌澄,中文可以翻譯為“靈丹妙藥”倚喂。一門運行在 Erlang 虛擬機上的新語言每篷,稱自己為靈丹妙藥,可見其霸氣。Elixir 嘗鮮之后焦读,發(fā)現(xiàn)確實是一門博采眾長的新語言子库。下面進行 Elixir 的簡單介紹。
安裝 Elixr
安裝 elixir 相當方便矗晃,官方文檔給出了不同平臺的方法仑嗅。由于 elixir 是運行在 erlang 虛擬機上的,因此需要安裝 erlang喧兄。下面介紹在 MacOS 下的安裝方法无畔。如果有 homebrew,安裝只需要兩條命令吠冤。
-
安裝 erlang
brew install erlang
-
安裝 elixir
brew install elixir
打開 Terminal, 輸入
elixir -v
可以獲取安裝的版本號浑彰,目前最新的是 1.0.2版本
Hello World
Elixir 自帶了一個交互解釋器,就像Python那樣可以直接輸入代碼就執(zhí)行拯辙,也類似 Ruby 的IRB眯分。這個交互解釋器為 IEX
吁脱。在 Terminal里面直接輸入 iex思币,就可以進入elixir交互環(huán)境钞诡,按住control+z
退出,或者連續(xù)安兩次control+c
夕春。
進入 iex未荒,會看到下面的樣式:
Erlang/OTP 17 [erts-6.3] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
Interactive Elixir (1.0.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
輸入 "Hello World"
, elixir 用雙引號來表示字符串。
> "Hello world"
"Hello world"
>
可以用 <>
連接字符串
> "hello" <> " " <> "elixir"
"hello elixir"
>
字符串支持多行及志,敲回車就可以跳下一行片排,直到遇到結(jié)束的雙引號。不需要在前面留白速侈,相當贊的功能率寡。
> "I
> like
> elixir"
"I\nlike\nelixir"
>
基本運算
計算機本來就是用來做計算的,elixir當然也可以做計算倚搬,以及定義函數(shù)運算冶共。elixir支持常見的數(shù)學運算。
> 1 + 1
2
> 2 * 3
6
> 10 / 2
5.0
> 10 / 3
3.3333333333333335
> 10 / 3.0
3.3333333333333335
> 3 * (1 + 2)
9
注意每界,elixir的除法總是返回浮點類型捅僵,例如上面的 10 / 2
返回的是 5.0
而不是5
。如果你想進行整型除法眨层,或者求余數(shù)命咐,可以使用div
和rem
函數(shù)。elixir的函數(shù)調(diào)用時候的括號是可以省略的谐岁,畢竟語言的作者是 rails 的核心成員,具有濃厚的 ruby 風格。
> div(10, 2)
5
> rem 10, 3
1
匿名函數(shù)
elixir 可以定義匿名函數(shù)伊佃,并且匿名函數(shù)可以匹配某個變量窜司,通過變量調(diào)用匿名函數(shù)。定義匿名函數(shù)的關(guān)鍵字是 fn
和 end
航揉。
> sum = fn x, y -> x + y end
#Function<12.90072148/2 in :erl_eval.expr/5>
> sum.(10, 9)
19
elixir是函數(shù)式范式編程語言塞祈,函數(shù)貴為一等公民。既可以直接調(diào)用帅涂,也可以當參數(shù)傳入议薪。匿名函數(shù)是閉包,因此它們可以訪問當前作用域(scope)內(nèi)的其它變量媳友。并且elixir也可以定義像js那種立即執(zhí)行的匿名函數(shù)
> x = 9
> (fn x -> x + 1 end).(x)
10
> x
9
基本數(shù)據(jù)類型
前面我們嘗試了elixir的簡單例子斯议,其中發(fā)現(xiàn)了=
這個符號,在數(shù)學里這個是等號醇锚,表示左右兩邊相當哼御,學過編程的人都知道,程序里的=
不是等號焊唬,而是賦值
號恋昼,指把右邊的表達式或數(shù)值賦給左邊的變量。elixir
與別的語言不一樣赶促,=
不能稱之為賦值號液肌,而是匹配運算符
,elixir稱之為模式匹配
(pattern match)鸥滨。后面我們再做解釋嗦哆。
前面我們見識了elixir的基本數(shù)據(jù)類型中的數(shù)字相關(guān)的類型。elixir的基本數(shù)據(jù)類型包括下面的幾種:
- 布爾(boolean)
- 數(shù)字(number)
- 整型(integer)
- 浮點(float)
- 原子(atom)
- 字符串(string)
- 匿名函數(shù)(anonymous function)
- 列表(list)
- 元組(tuple)
布爾類型
elixir 用 true
和false
來表示布爾類型爵赵。對于判斷類型吝秕,python提供了一個 type函數(shù)相當方便,可惜elixir并沒有這樣的type函數(shù)空幻。不過elixir提供了不同的函數(shù)烁峭,用來判斷類型,例如判斷是否是布爾類型的is_boolean
函數(shù)秕铛。
> is_boolean(true)
true
> is_boolean(false)
true
> is_boolean(1)
false
> is_number(1)
true
注意约郁,1 是數(shù)字類型,并不是布爾類型但两,當然在條件判斷的時候鬓梅,1 可以布爾值可以是true。后面會提到谨湘。
函數(shù)表示方法
elixir的文檔工作做得也很好绽快,對于語言的概念的描述和應(yīng)用芥丧,也有自己的一套。例如函數(shù)的描述方法通常為 `<函數(shù)名>/<元數(shù)>`(<function name>/<arity>)坊罢。上面的判斷類型函數(shù)可以描述為 `is_boolean/1`, `is_number/1`续担。元數(shù)可以理解為函數(shù)的參數(shù)。這個描述的好處在于活孩,可以用幫助函數(shù) `h` 來查看一個函數(shù)的文檔和使用方法物遇。類似python里的 `help` 函數(shù)。
使用 h 查看 is_boolean/1憾儒。
> h is_boolean
def is_boolean(term)
Returns true if term is either the atom true or the atom false (i.e. aboolean); otherwise returns false.
Allowed in guard tests. Inlined by the compiler.
>
配合模塊的文檔和函數(shù)的文檔询兴,能過構(gòu)建文檔完善的程序,這一點充分借鑒了Python的文檔字符串設(shè)計起趾。
原子
原子
(atom)是一種常量诗舰,變量名就是它的值。ruby阳掐、lisp 中稱其為符號
(symbol)始衅。定義十分簡單,只需要在字符前加上:
符號缭保。
> :atom
:atom
> :hello
:hello
> :123
** (SyntaxError) iex:29: invalid token: :123
注意汛闸,大寫字母開頭的"變量",其實是一種原子艺骂,是:Elixir.變量名
的別名诸老。模塊通常是用大小字母開頭的,后面會用到钳恕。
> Hello
Hello
> Hello == :hello
false
> Hello == :Elixir.Hello
true
列表
列表是常用的數(shù)據(jù)類型别伏,很多語言都支持列表或者數(shù)組的結(jié)構(gòu)。elixir的列表稍微有點不同忧额。
列表的聲明可以使用一對方括號[]
厘肮,列表的元素可以是任意的數(shù)據(jù)類型。通過++
或者--
可以拼接列表和消除列表
> list = [1, 2, true, 3]
[1, 2, true, 3]
> [1, 2, 3] ++ [4, 5, 6]
[1, 2, 3, 4, 5, 6]
> [1, 2, 3, 11, 22, 33, 33, 22, 11] -- [11, 22, 33]
[1, 2, 3, 33, 22, 11]
列表相減的時候睦番,是按照元素位置進行匹配的类茂。想要獲取列表的長度,也就是元素的個數(shù)托嚣,可以通過函數(shù) lenght
得到巩检,通過 hd
函數(shù),可以獲得列表的第一個元素示启,tl
函數(shù)則獲取除第一個元素的剩余列表元素兢哭。這個操作在遞歸的時候很有用。當列表為空的時候夫嗓,hd 和 tl 都會報錯迟螺。
> list = [1, 2, 3, 4]
[1, 2, 3, 4]
> length list
4
> hd list
1
> tl list
[2, 3, 4]
列表在內(nèi)存中是以鏈表的形式存儲的冲秽,一個元素指向下一個元素,然后再下一個...直到到達列表末尾煮仇。我們稱這樣的一對(元素值+指向下一個元素的指針)為列表的一個單元(cons cell)劳跃。 由于列表的存儲結(jié)構(gòu),獲取列表的元素浙垫,都需要遍歷列表,獲取列表的長度是一個線性操作郑诺。我們必須遍歷完整個列表才能知道它的長度而給列表刪除和插入元素則相當高效夹姥。
|
這個操作符可以拼接列表,指在列表前置一個列表辙诞。事實上辙售,列表的定義,就是單個列表元素拼接起來的飞涂,寫出中括號的方式只是語法糖罷了旦部。
> list = [3, 4, 5]
[3, 4, 5]
> [3| [4| [5| []]]]
[3, 4, 5]
> [1 | list]
[1, 3, 4, 5]
> [[1, 2] | list]
[[1, 2], 3, 4, 5]
> [1, 2 | list]
[1, 2, 3, 4, 5]
> list = [3|[]]
元組
elixir 的列表是鏈式存儲的,而元組則是連續(xù)存儲的较店,因此可以通過所以的方式訪問元組士八。當然,修改元組梁呈,比如插入刪除元素則開銷很大婚度。元組的作用很大,通過用來存儲一些不容易變的數(shù)據(jù)官卡。
元組的聲明很簡單蝗茁,只需要一對花括號{}
,里面的類型也可以是任意類型寻咒∠蹋可以用 elem
函數(shù)和索引訪問元組。
> t = {1, :ok, "hello"}
{1, :ok, "hello"}
> elem t, 1
:ok
更多的元組操作毛秘,會在后面的內(nèi)容提及饭寺。
字符列表
字符串是用雙引號定義的,單引號則定義的是字符串列表熔脂,可以使用列表的一些函數(shù)操作佩研。
> 'hello'
'hello'
> list_str = 'hello'
'hello'
> is_list list_str
true
> 'hello' ++ 'world'
'helloworld'
Enjoy Elixir
這樣就把elixir的基本東西快速瞥了一遍。具體每個數(shù)據(jù)類型的深入了解和運用霞揉,以及強大的函數(shù)旬薯、模塊、宏等概念將會陸續(xù)介紹适秩。
學習Elixir的時候绊序,收獲最大的則是《Elixir Programe》這本書硕舆。并且也按照自己的理解做了一些基礎(chǔ)的翻譯(github地址),這些筆記就是在翻譯學習之后自己的總結(jié)骤公。有興趣的童鞋可以參考抚官,或者幫忙修正。