Lua 類型教學

lua-users home
wiki

以下是 Lua 中八種值類型的簡短介紹:數字、字串、布林值、表、函式、nil、userdata、執行緒。每個區塊都介紹一種不同的類型。

請參閱 TutorialExamples 以取得有關如何執行範例的說明。我們將使用 print() 函式來列印值或對這些值的運算。括在引數周圍的括號很重要,如果省略將會造成錯誤。

> print("hello") -- print the string hello.
hello

數字

數字類型表示浮點數(小數)。自 5.3 版後,整數(非小數)值會有單獨的內部表示方式。不過,這些值也視為屬於「數字」類型。

Lua 允許使用一般運算子對數字進行加減乘除的簡單算術運算。

> print(2+2)
4
> print(2-7)
-5
> print(7*8)
56
> print(7/8)
0.875

請注意,數字不會四捨五入為整數。它們是浮點數或實數。我們可以使用 = 運算子將值指定給變數。

> x = 7
> print(x)
7
= 運算子會將數字 7 指定給變數 x。我們再次使用 print() 函式來列印 x 的值。我們現在可以在其他運算中使用 x 中的值。
> x = x * 9
> print(x)
63
> print(x*2) -- will not change the value of x
126
> print(x)
63

有關 Lua 數字類型的更多資訊,你可以參閱 NumbersTutorial

字串

Lua 也使用字串(亦即文字)類型。若要建立字串,請將文字以 "雙引號"'單引號' 括起來

> print("hello")
hello
我們可以將字串指定給變數,就像數字一樣
> who = "Lua user"
> print(who)
Lua user
我們可以使用 .. 運算子將字串串接(結合在一起)
> print("hello ")
hello 
> print("hello " .. who) -- the variable "who" was assigned above
hello Lua user
> print(who)
Lua user

與其他語言不同,無法使用 + 運算子串接字串。即

> message = "hello " + who
stdin:1: attempt to perform arithmetic on a string value
stack traceback:
        stdin:1: in main chunk
        [C]: ?

有關 Lua 字串類型的更多資訊,你可以參閱 StringsTutorial

布林值

布林值的值可能是 truefalse。如果一個值不是 true,就一定是 false,反之亦然。not 運算子可以置於布林值之前,使其反相。即 not true 等於 false

> x = true
> print(x)
true
> print(not x)
false
> print(not false)
true
布林值用於表示邏輯測試的結果。相等 == 和不相等 ~= 運算子會根據傳遞給它們的值傳回布林值。
> print(1 == 0) -- test whether two numbers are equal
false
> print(1 == 1)
true
> print(1 ~= 0) -- test whether two numbers are not equal
true
> print(true ~= false) -- is true not equal to false?
true

請注意,對於指定,你使用單等號 (=),但是對於比較,你使用雙等號 (==)。這兩個運算子具有不同的意義,但看起來很相似,常犯的錯誤是寫一個而在意思上指另一個。

有關 Lua 布林值類型的更多資訊,你可以參閱 ExpressionsTutorial

Lua 有一個稱為表的通用集合資料類型。集合資料類型用於儲存包含其他物件(包括數字、字串,甚至是其他集合)的集合(例如清單、集合、陣列和關聯式陣列)。Lua 是獨特的語言,其中表(即關聯式陣列)用於表示其他所有集合類型。

使用一對大括號 {} 創建表。讓我們創建一個空表

> x = {}
> print(x)
table: 0035C910
(如果您的表格沒有與上述範例中相同的唯一識別碼,這是正常的)

稍後,TablesTutorial 將說明如何使用表格

函式

在 Lua 中,函式會指派給變數,就像數字和字串。函式是使用 function 關鍵字創建的。我們在此創建一個簡單的函式,將會列印友善訊息。

> foo = function () print("hello") end -- declare the function
> foo() -- call the function
hello
> print(foo) -- get the value of the variable "foo"
function: 0035D6E8
請注意,我們可以列印變數 foo 的值,並顯示(如下表)該值是函式,並有該特定函式的唯一識別碼。因此,如同其他任何值一樣,應該能夠將函式指派給變數,就像其他值一樣,而且我們可以。
> x = function() print("hello") end
> x()
hello
> print(x)
function: 0035EA20
能夠執行此操作是因為 Lua 具有一等值。這表示所有值都以相同的方式處理。這是 Lua 非常強大且有用的功能。

函式可以是表的一部分

> a = "aeiou" -- a string
> b = 13      -- a number
> c = function()  -- a function
>  print ("\n\n\tAin't it grand")
> end
> d = { a, b ,c} -- put them in a table
> function printit(tata)  -- print their types.
>> for key, value in ipairs(tata) do print(key, type(value)) end
>> end
> printit(d)
1       string
2       number
3       function
        

稍後,FunctionsTutorial 將說明如何使用函式

nil 值

nil 是表示沒有可用值的特殊值。如果您嘗試取得不存在的變數,將會得到 nil

> print(x)
nil
> x = 2.5
> print(x)
2.5

其他地方使用 nil 會在其他教學課程中說明

使用者資料

使用者資料值是 Lua 以外的物件,例如 C 中實作的物件。這些通常在 C 程式庫中的物件公開給 Lua 時產生。您在 Lua 中無法使用使用者資料值進行任何操作(除了傳遞它),它僅可提供給由建立使用者資料的相同 C 程式庫公開的函式。但透過使用稍後課程中說明的元方法,可以讓使用者資料與運算子搭配使用,並具有類似於表的動作。使用者資料是進階主題,在 [Lua 參考手冊] 中有進一步說明

執行緒

執行緒值可代表獨立(協力)的執行執行緒。稍後在 CoroutinesTutorial 中會進一步說明

動態類型化

您可能已注意到,在我們建立上述變數時,不需要指定我們要建立的變數類型。例如

a = 1
b = "hello"
c = {}
在其他程式語言(如 C)中,我們必須在建立變數時指定變數類型。在 Lua 中,我們也可以將不同類型的值指派給相同變數,例如
a = 1
a = "hello"
a = {}
Lua 具有動態類型化。這表示類型是在程式執行時檢查的。與許多其他具有動態類型化的程式語言一樣,在 Lua 中,您不需要指定變數的類型。變數會從指派給它的值或物件知道其類型。

查詢類型

由於 Lua 是個反射式語言,我們可以使用 Lua 函式 type() 來取得某特定物件類型的描述。

> x = "123"  -- a string
> print(x, type(x)) -- show the value of x and its type
123     string
> x = x + 7  -- add a number to the string which forces coercion
> print(x, type(x)) -- again show the value and type
130     number

最近變更 · 喜好設定
編輯 · 歷史
最後編輯於 2024 年 1 月 25 日,上午 12:51(格林威治標準時間)(diff)