1. 程式人生 > >Lua基礎 型別和值(一)

Lua基礎 型別和值(一)

Lua是一個動態型別的語言,沒有型別定義,每個值都有自己的型別。

Lua有8個基本型別,nil, boolean, number, string, userdata, function, thread, table,利用type函式可以打印出一個給定值的型別。


注意最後一行,無論x為什麼值,結果一定是string,因為type函式的結果總是一個string。

變數沒有預定義的型別,任何變數可以有任何型別的值


注意最後兩行,函式也是可以用來賦值的,你可以像對待其他的變數一樣來把函式當成一個變數。

通常情況下,如果你把一個變數用來包含不同型別的值,會使程式碼看起來很混亂。但是,有時有效地利用這個特性,會有意想不到的效果。例如使用nil來對函式的返回值就行判斷,來區分一個正常的返回值還是一個異常條件。

1 Nil

Nil型別只有一個值,nil,跟其他任何值都不同。如我們之前看到的,在一個全域性變數未被賦值之前,它的值為nil,你也可以通過將一個全域性變數賦值為nil來刪除它。Lua用nil作為一個無值型別,表示一個變數不再起作用。

2 Booleans

Boolean型別含有兩個值,true和false。但是Lua中可以表示條件的變數不僅僅boolean型別,任何值都可以表示條件。Lua認為false和nil為"假",其他任何值都是"真"。注意,跟其他語言不同的是,Lua認為0和空字串為"真"。

3 Numbers

Number型別代表實數(在計算機中佔兩個地址的浮點數)。Lua沒有整型,並且也不需要。有個普遍的誤解,使用浮點型會有算術錯誤,一些人害怕浮點型即使一個簡單的“加”運算也會有奇奇怪怪的問題。但事實上,用一個double型別來表示一個integer,不存在任何邊界問題(除非這個數大於1.0e14)。Lua可以表示任何的32-bit的整數,不存在任何邊界問題。除此之外,大多數cpu處理浮點數會比整數要快。

不過,Lua為了編譯方便,也使用了其他的number型別,例如long和單浮點數。這是為了相容一些不支援double型別的裝置。

以下這些numeric常量都是合法的

4

0.4

4.57e-3

0.3e12

5e+20

4 Strings

String在Lua中與其他程式語言沒有什麼不同,都是表示一串字元。但是Lua可以在字串中含有任何字元,包括0.

String在Lua中不可被更改,是常量。你不能更改一個字串中的某一個字元,但是可以建立一個新的string。例如

Lua的string是自動管理記憶體的,其他的lua物件(例如table, function,etc)也一樣。這意味著你不必擔心string的記憶體分配與釋放,讓Lua為你處理這些問題就好了。一個string可以包含一個字元,也可以包含一整本書,Lua可以有效地處理長string,處理100k-1M的字串,對Lua來說是小菜一碟。

4.1 Lua string的劃界

上面說了,Lua的string可以包含任何字元,甚至0(在C中,0是被認為是string的結尾的)。因此Lua對字串邊界的判定,不能用0,而是匹配單引號'或者雙引號" :


但是在程式設計的時候,為了風格統一,最後是隻用其中一種,除非string本身含有引號。或者在字串中用轉義字元。Lua的string可以使用以下C風格的轉義字元:

\a     bell

\b     back space

\f     form feed

\n    newline

\r     carriage return

\t     horizontal tab

\v     vertical tab

\\     backslash

\"     double quote

\'      single quote

示例如下:


我們可以在string中用一個字元的ASCII值來表示它,格式為\ddd,這裡ddd最多包含3個數字字元,例如:

97表示"a", 10表示new line,49表示數字"1",注意\049沒有寫成\49的原因是,後面跟的字元是數字,若寫成\49,那麼會被認為是\492,這就不是我們想要的了。

對string劃界,除了匹配引號之外,我們可以像處理長註釋一樣,匹配兩個“[[”“]]”。使用這種劃界方式的string通常會有幾行,如果第一個字元是“換行符”,則會被忽略掉,並且不會解釋轉義字元(如下示例),保持原樣輸出。通常在string中包含程式碼片段的時候使用比較方便。


這個時候,有個疑問,如果我的string中含有“[[”或者“]]”,怎麼辦。Lua提供了一個更方便的解決辦法,就是使用類似[====[這樣的匹配符號,“=”個數任意,但是保證前後相同,如果“=”個數不同,那麼就會被忽略掉。


這種方式也可以用在長註釋中,這裡就不演示了。

4.2 Lua中string與number的相互轉換

Lua提供了string和number的執行時自動轉換。任何對string進行的算術操作,都會嘗試將string轉換為number。例如:


除了算術操作,其他任何期待一個number的地方,如果傳入string,都是嘗試將string轉換為number。相反,在一個期待string的地方,如果傳入number,那麼也會嘗試將number轉換為string。


“..”是Lua中的字串連線符,在10之後要有一個空格“ ”,否則第一個“.”會被看作是小數點。

現在看來,在Lua的設計中,支援這些自動轉換是不是一個good idea,都沒有一個定論。但是,不要太指望它們。它們在少數場合用起來很方便,但是會增加語言的複雜性,增加使用它們的程式的複雜性。畢竟string和number是兩個不同的東西。10 == “10”是false,因為10是一個number,而“10”是一個string。如果你想把string轉換為number,顯式地用函式tonumber,如果要轉換的string不能被轉為number,它返回nil。


將number轉換為string,可以用函式tostring。另外,可以用“#”來取得一個string的長度。


水平有限,如果有朋友發現錯誤,歡迎留言交流。