Lua基礎 型別和值(一)

2021-08-27 07:36:08 字數 3463 閱讀 6196

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

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

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

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

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

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

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

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

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

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

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

40.4

4.57e-3

0.3e12

5e+20

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

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

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

上面說了,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提供了乙個更方便的解決辦法,就是使用類似[====[這樣的匹配符號,「=」個數任意,但是保證前後相同,如果「=」個數不同,那麼就會被忽略掉。

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

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的長度。

Lua基礎(一) 型別和值

lua是動態型別語言,變數沒有型別定義,每個變數都可以包含任何型別的值。lua的基本型別 boolean number string userdata function thread table定義幾個變數並檢視他們的型別,如下 testbool true boolean testnum 12.3 ...

LUA教程型別和值 6

lua是動態型別語言,變數不要型別定義。lua中有8個基本型別分別為 nil boolean number string userdata function thread和table。函式type可以測試給定變數或者值的型別。print type hello world string print t...

LUA型別與值

lua是一種動態型別語言,語言中沒有型別定義的語法,每個值都攜帶有自身的型別資訊。lua中有8個基礎型別 nil 空 boolean 布林值 number 數字 string 字串 table 表 function 函式 userdata 自定義型別 和thread 執行緒 用type函式可以返回其...