Erlang 學習筆記(二)

2021-08-31 05:56:57 字數 3511 閱讀 8114

erlang 學習筆記(二)

[email protected]

[size=medium]1.5 erlang的資料型別[/size]

[b][u]變數(variables):[/u][/b]

從[url=927861]erlang 學習筆記(一)[/url]中的**中的double函式定義發現,其引數為x,而且是大寫的,這就是erlang對變數定義的要求。

erlang中變數必須以大寫字母開頭,比如number,shoesize,age等。如果不是以大寫字母開頭,編譯時會報錯。

[b][u]atoms:[/u][/b]

erlang中另外一種資料型別叫atoms。atoms以小寫字母開頭,僅僅表示名字而已,沒有其他意義,變數可以儲存資料,而atoms則不能存值資料。比如tut2中

[quote]-module(tut2).

-export([convert/2]).

convert(m, inch) ->

m / 2.54;

convert(n, centimeter) ->

n * 2.54.

[/quote]

convert函式將英吋和厘公尺相互轉換。在這個convert函式定義中使用的"inch"和"centimeter"就是atoms,m和n是變數。atoms在這裡相當於用來區分兩個函式的用途,起到標記的作用。

在convert inch的定義結束時,使用了";"而不是".",這表示分號之後還有屬於該函式的**。

編譯和執行結果如下:

[quote]5> c(tut2).

6> tut2:convert(20, inch).

7.874015748031496

7> tut2:convert(20, centimeter).

50.8

[/quote]

[b][u]元組(tuples):[/u][/b]

erlang使用tuple將一組相關的資料放在一起,使得更易於理解。tuple用大括號「{}」將元素包圍起來。回憶一下,scala中也有tuple,其意義和erlang的一樣,區別是使用小括號「()」。

比如tut3:

[quote]-module(tut3).

-export([convert_length/1]).

convert_length() ->

;convert_length() ->

.[/quote]

編譯和執行結果如下:

[quote]10> tut2:convert(20, inch).

7.874015748031496

11> tut2:convert(20, centimeter).

50.8

12> tut3:convert_length().

13> tut3:convert_length().

14> tut3:convert_length(tut3:convert_length()).

[/quote]

注意上面14行是如何工作的,首先將20厘公尺轉換成英吋,然後在轉換回厘公尺,結果還是原來的20厘公尺。函式的返回值作為外層函式的輸入引數。

截止目前為止,我們看到的元組都只有兩部分,實際上元組可以有任一多部分組成。比如:

[quote]} }}

[/quote]

[b][u]列表(lists):[/u][/b]

列表就是用「」將多個元素括起來,元素之間用逗號「,」隔開。比如:

[quote][}, }, }, },

}][/quote]

list一般如果比較長,一行寫不下的話,則erlang允許將**在任何「合理」的地方斷開,比如,只要不在atoms,integers等中間斷開就可以。

另外可以使用"|"來查詢list中特定位置上的元素,請看如下的例子:

[quote]20> [first | rest] = [1, 2, 3, 4].

[1,2,3,4]

21> first.

122> rest.

[2,3,4]

[/quote]

這和scala中的模式匹配非常類似。first匹配上了第乙個元素,剩餘的全部元素匹配給rest。

[quote]23> [first2, second2 | rest2] = [1, 2, 3, 4, 5, 6, 7, 8].

[1,2,3,4,5,6,7,8]

24> first2.

125> second2.

226> rest2.

[3,4,5,6,7,8]

27> [/quote]

使用"|"獲取list中前兩個元素,剩餘的賦給"|"後面的元素。如果list長度比要匹配的少乙個,則返回空list。比如:

[quote]4> [one, two, three | last] = [1, 2, 3].

[1,2,3]

5> last.

6> three.

3[/quote]

如果list的長度比要匹配的少多個,則會拋異常:

[quote]5> [one, two, three | last] = [1, 2].

** exception error: no match of right hand side value [1,2][/quote]

看乙個使用list的綜合例子。該例子list_length獲取list的長度:

[quote]-module(tut4).

-export([list_length/1]).

list_length() ->

0;list_length([first | rest]) ->

1 + list_length(rest).

[/quote]

編譯和執行:

[quote]10> c(tut4).

./tut4.erl:6: warning: variable 'first' is unused

11> tut4:list_length().

012> tut4:list_length([1, 2, 3, 4]).

413> tut4:list_length(["hello", "hi"]).

2[/quote]

看到編譯時提示的警告,說first定義了但是沒有使用,跟scala一樣,我們可以用佔位符「_」代替first,然後再次編譯執行就沒問題了。**如下:

[quote]-module(tut4).

-export([list_length/1]).

list_length() ->

0;list_length([_ | rest]) ->

1 + list_length(rest).

[/quote]

[b][u]字串(string):[/u][/b]

erlang沒有string資料型別,而字串可以給ascii碼代替。因此[97, 98, 99]和「abc」相等。比如:

[quote]23> [97, 98, 99].

"abc"

[/quote]

guibin

Erlang學習筆記(二)

今天在練習map對映組的時候 本人erlang版本17.01 根據 erlang程式設計 第二版這本書上操作,在取值的時候發現問題,如下 書中操作 如下圖 明顯兩個程式執行不一樣,後來看到官方文件,才發現是這個樣子 在上圖中明確指出,在map對映組中取值的時候用 取值,後來又看了看兩者區別發現兩者只...

Erlang學習筆記(二)

erlang的併發特性源自語言本身而並非作業系統。它把現實世界模擬成一系列的程序,其間僅靠交換訊息進行互動,因此erlang簡化了並行程式設計。在erlang世界中,存在並行程序但是沒有鎖,沒有同步方法,也不存在記憶體汙染的可能,因為erlang根本沒有共享記憶體.erlang程式可以由幾百萬個超級...

Erlang學習筆記二

函式的過載 module geometry export area 1 area width height area side side.通過傳輸元組的方式,可以實現方法的過載,會根據模式匹配自己尋找合適的匹配方法體。被export宣告的方法就是公有方法,而未被宣告的就變成私有方法。shell的操作...