erlang 學習筆記(二)
[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的操作...