ErlangOTP學習-Erlang基礎學習

需要先學習一下Erlang基礎。

從最簡單的數據類型開始。

7> 1.23456+1.0.  
2.23456
8> 1.234567+1.0. 
2.234567
9> 1.2345678+1.0.
2.2345677999999998
10> 

從上面浮點數的加法可以看到,erlang中,浮點數據在小數點後7位,相加就不能保證精確度了。

--------------------

erlnag中爲什麼沒有字符串呢?原因是,erlang語言是由電信公司研發的。在電信應用程序中並不依賴字符串操作。所以字符串也就從來沒有成爲過erlang中的一個數據類型。在erlang中字符串類型是由整數列表來表示的。

31> [66,67,68].
"BCD"
32> 

上面的三個數的列表表示的是字符串BCD。 

------------------------------------------

數學運算符

除法:div

取餘:rem

----------------------------------------

原子:atom,由小寫字母開頭,用來表示文字常量。和java中的static final是一樣的作用。

---------------------------

那麼原子和字符串有什麼區別呢?

唯一可以用於原子的操作是比較操作,而我們可以使用很多方式來操作字符串。例如把字符串“ni hao”分拆成["ni","hao"],而原子就不行。

原子和字符串之間還有一個比較大的區別就是效率。字符串存儲的時候是與字符串的長度成正比的。而原子則只需要幾個字節用作索引,與原子的大小無關。當一個程序需要比較字符串的時候,需要遍歷字符串中的每個字符。而原子的比較,只需要比較他們的內部標識符(對我們不可見)即可。

 ----------------------------

erlang中,變量必須都以大寫字母開頭。而且,變量只能賦值一次!這就是傳說中的單次賦值。

---------------------------------

erlang的一個優點是,它不需要明確的分配和釋放內存。用來存儲複雜數據結構的內存由系統按需自動的分配和釋放。

------------------------------------

模式匹配:注意,這裏說的模式匹配和“正則表達式”沒有任何關係

erlang中,模式匹配用於以下幾種情況:

1、變量賦值。

2、控制程序執行流程。

3、從符合數據類型中提取值。

比如,S=1+2.,就是一個模式匹配。然而,當一個變量已經被綁定過值了,那麼模式匹配就變成了比較變量當前的值與將要匹配的表達式是否相等了。

比如下面的例子:

9> S=1+2.
3
10> S
10> .
3
11> S=2+3.
** exception error: no match of right hand side value 5
12> 

由於S已經賦值過了,所以當執行S=2+3的時候,就會比較2+3與S是否相等。

---------------

當一個模式匹配執行的時候會發生什麼呢?

1、當模式匹配成功的時候,原來未被綁定值的變量就變成了綁定值的變量了。

2、當模式匹配失敗的時候,結果是沒有綁定值。

------------------------------------------

Erlang中所有函數變量調用都是按值調用的。在 函數被求值之前,所有的函數調用參數都已經被求值了。在Erlang中不存在引用調用的概念。Erlang中所有變量都是局部的。全局變量是不存在的。這不僅使erlang程序更加容易調試,也減少了出錯的風險,避免了不良的變成習慣。

Erlang中變量的另外一個特點就是,我們不需要聲明他們,只需要使用他們即可(這是因爲erlang中變量是動態類型的,根據變量上進行的操作,在運行的時候再確定變量的類型)。當然這也是有不好的地方,看下面的例子:

9> Var=one.
one
10> D=Var*2.
** exception error: an error occurred when evaluating an arithmetic expression
     in operator  */2
        called as one * 2
11> 
這個例子中,嘗試把一個原子乘以一個整數。這在編譯的時候並不會出錯。但是雲心的時候卻會報錯。

----------------------------------------

Erlang中變量只能賦值一次。但是如果我們一個程序要運行很多年,哪有那麼多變量名可以使用呢?

可以使用f()函數來解綁定。不過只能在終端中使用它。嘗試在程序中使用它,會導致編譯錯誤。

下面是解綁定的一個例子:

11> D.
2
12> f(D).
ok
13> D
13> .
* 1: variable 'D' is unbound
14> 

-------------------------------------

模式匹配除了上面說的變量賦值以外,還可以控制程序的流程。


---------------------------------

模式匹配還可以從複雜類型中提取值。看例子:

踀51> P={"naughty",11,"gz"}.
{"naughty",11,"gz"}
52> {Name,Age,Addr}=P.    
{"naughty",11,"gz"}
53> Name.                 
"naughty"
54> Age.                  
11
55> Addr.                 
"gz"
56> 

------------------------------

最後看一個比較特殊的例子:

25> [A,B|C]=[1,2,3,4,5,6,7].
[1,2,3,4,5,6,7]
26> A
26> .
1
27> B.
2
28> C.
[3,4,5,6,7]
29> 
上面例子中,使用[A,B|C]=[...]來給ABC三個變量賦值。其中A匹配到了1,B匹配到了2,剩下的由C匹配。

32> [A,B|C]=[1,2].          
[1,2]
33> A.
1
34> B.
2
35> C.
[]
36> 
上面的這個例子,也是用ABC去匹配變量。但是由於右側的列表僅包含兩個元素,所以C最終沒有匹配到元素,C是一個空列表。看看與下面的例子有什麼不同?

踀36> [A,B,C]=[1,2].
** exception error: no match of right hand side value [1,2]
37> 
上面的這一行代碼[A,B,C]表明右側列表至少有三個元素。但是實際上只包含兩個。

在[A,B|C]這個例子中,C綁定到右側列表的尾部。由於綁定完AB之後,尾部沒有更多列表了,所以C就成爲空列表了。

--------------------------------------------

發佈了339 篇原創文章 · 獲贊 66 · 訪問量 236萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章