天天看點

elixir 入門筆記安裝基本資料類型基本運算符模式比對控制語句鍵值清單-圖-字典子產品和函數定義枚舉類型和流程序子產品屬性結構體協定異常處理清單速構sigils(魔法印)

如果沒有 erlang 環境,上面的指令會自定安裝 erlang 的環境。

/ 總是傳回浮點數,如果需要整數運算,使用 div 和 rem 函數

原子是一種常量,變量名就是它的值。有2種寫法:

:原子名

:"原子名"

清單中可以包含任意資料類型

清單可以通過 ++/– 來拼接

可以通過 hd/1 tl/1 函數來擷取頭部和頭部以外的部分

對一個空清單執行 hd/1 和 tl/1 會報錯

清單是以連結清單形式在記憶體存儲的,元組是在記憶體中連續存儲的。

清單前置拼接操作很快,後置拼接操作慢

後置拼接時修改了原清單的最後一個元素,是以會重建整個清單

函數的傳回值一般用元組來儲存

雙引号包裹的是字元串: 字元串中存儲的是 byte

單引号包裹的是字元清單: 字元清單中存儲的是每個字元的 codepoint

算術運算 + - * / div/2 rem/2

清單拼接 ++ –

字元串拼接 <>

布爾運算符

or and not 這3個運算符隻接受布爾值作為第一個參數

|| && ! 這3個運算符可以接受非布爾值作為第一個參數

比較運算符

<code>= !</code> <code>=</code> !== &lt;= &gt;= &lt; &gt;

<code>= !</code> 和 <code>=</code> !== 相比,後者的檢查更加嚴格

不同資料類型之間也可以比較大小

不同資料類型之間的預設的順序如下:

elixir 中 = 是模式比對運算符

可以給list 的 head 和 tail 指派

case的條件中可以加入判斷的表達式,比如下面的 (when x &gt; 0)

隻會執行第一個比對上的分支

unless 和 if 相反,條件為false時才執行

do 語句快有2種寫法:

鍵值清單還有另一種定義方式:(注意 a: 和 1 之間必須有個空格)

鍵值清單2個特點:

有序

key 可以重複,重複時,優先取排在前面的key

圖的2個特點:

圖中的key是無序的

圖的key可以是任意類型

圖比對時,隻要 = 右邊包含左邊的值就能比對上

修改圖中的值可以用以下的方式:

以上的 鍵值清單 和 圖 都是 字典 ,它們都實作了 Dict 接口。

此子產品現在已經 deprecated

枚舉類型提供了大量函數來對清單進行操作

枚舉操作都是積極的,比如如下的操作:

以上每步的操作(Enum.map, Enum.filter)都會産生一個新的清單,這就是 積極 的意思。

和上面的枚舉類型對應,流的處理是 懶惰 的,比如:

表面上看,和枚舉類型的處理一樣,而實際上,流先建立了一系列的計算操作。然後僅當我們把它傳遞給Enum子產品,它才會被調用。

elixir中程序都是輕量級的,是以使用時不用太在意程序的數目。

派生的程序執行完自動結束自己

發送和接收消息

下面示例中是給自己發送了一條消息,可以通過 flush/1 函數重新整理消息,重新整理一次之後就

也可以通過 receive/1 函數來接收

receive/1 函數收不到消息會阻塞,可以給它設定一個逾時時間

程序間的連接配接

程序B連接配接程序A之後,程序A出現異常,程序B就能捕獲,這樣程序B就能處理程序A的異常

程序連接配接的方式很簡單,就是 spawn_link/1 函數

程序中儲存狀态的方法:

elixir中子產品的屬性主要有3個作用:

作為一個子產品的注釋,通常附加上使用者或虛拟機用到的資訊

作為常量

在編譯時作為一個臨時的子產品存儲

注釋時,一些常用的子產品屬性如下:

名稱

含義

@moduledoc

為目前子產品提供文檔

@doc

為該屬性後面的函數或宏提供文檔

@behaviour

(注意這個單詞是英式拼法)用來注明一個OTP或使用者自定義行為

@before\_compile

提供一個每當子產品被編譯之前執行的鈎子。這使得我們可以在子產品被編譯之前往裡面注入函數。

作為常量:

測試方法:

子產品中的變量隻在編譯時存在,是以用做臨時存儲,存儲一些隻在編譯時使用的變量。

示例:

定義

使用方式

協定類似于其他語言中的接口,誰實作了協定,誰就可以使用協定,

比如下面的例子,Integer 和 User 結構體實作了協定,就可以使用協定中的方法。

使用示例:

上面的 string 類型沒有實作協定,是以不能使用。

我們在實際使用中也不會對沒種類型都實作協定,為了避免出現異常,可以設定協定對所有類型的預設實作

這樣以後,如下使用就不會報錯了

自定義異常使用 defexception/1 函數,

elixir 雖然提供了 try/catch/rescue/after 的結構,但是盡量不要使用這種結構,使用這種異常處理方式,會影響現有程式的處理流程。

elixir 的很多函數都會傳回錯誤信号,通過信号來處理錯誤是推薦的方式(類似golang的錯誤處理),比如如下示例:

速構的意思也就是從一個清單友善的生成另一個清單。

生成器

過濾器

二進制轉化為元組

into

删除空格

sigils 也就是對已有的變量或者常量做一些标記,使之變為其他的東西。

sigils 的目的就是提高 elixir 語言的擴充性。

正規表達式中的使用

表示字元串,字元以及清單的示例

~w 還可以加入其他的修飾符(比如:c, s, a 分别代表字元清單,字元串,原子)

自定義 sigils

本文轉自wang_yb部落格園部落格,原文連結:http://www.cnblogs.com/wang_yb/p/5333019.html,如需轉載請自行聯系原作者