lua中的基本型別

2021-06-27 21:14:42 字數 3503 閱讀 3104

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

Golang中的基本型別

package main import strconv 變數的宣告 var v1 int var v2 string var v3 10 int 陣列 var v4 int 陣列切片 var v5 struct var v6 int 指標 var v7 map string int map,key為...

八 Oracle中的基本型別

數字型別 浮點數日期型別 lob型別 long raw long raw型別 上一章 oracle的連線監聽與本地網路配置 下一章 oracle建立表及約束管理 char型別,定長字串,會用空格填充最大長度,非null的char 12 總是包含12個位元組的資訊 三個漢字 char欄位最多可以儲存2...

C 中的基本型別理解

1 c 把所有基本型別都封裝成自己的型別了,如下圖,int被封裝成了乙個struct結構體。如果定義乙個int物件,是可以呼叫int結構體裡的函式的 2 和c c 不同,c 的char就是單純的代表ascii碼,而不是用來參與運算的型別 用byte代替 而c c 中char是可以隨便賦值的,可以輕鬆...