基礎介紹
lua是一種動態型別的語言。在語言中沒有型別定義的語法,每個值都帶有其自身的型別資訊。在lua中有8種基本型別,分別是:
nil(空)型別
boolean(布林)型別
number(數字)型別
string(字串)型別
userdata(自定義型別)
function(函式)型別
thread(執行緒)型別
table(表)www.cppcns.com型別
以上是lua中的8中基本型別,我們可以使用type函式,判斷乙個值得型別,type函式返回乙個對應型別的字串描述。例如:
local ivalue = 10
local fvalue = 10.2
local strvalue = "hello world"
local funcvalue = print
local bvalue = true
local nilvalue = nil
local tbvalue = {}
if type(ivalue) == "number" then
print("it is a number")
endif type(fvalue) == "number" then
print("it is a number")
endif type(www.cppcns.comstrvalue) == "string" then
print("it is a string")
endif type(funcvalue) == "function" then
print("it is a function")
endif type(bvalue) == "boolean" then
print("it is a boolean")
endif type(nilvalue) == "nil" then
print("it is a nil")
endif type(tbvalue) == "t程式設計客棧able" then
print("it is a table")
endnil(空)
nil是一種型別,它只有乙個值nil。乙個全域性變數在第一次賦值前的預設值就是nil,將nil賦予乙個全域性變數等同於刪除它。lua將nil用於表示一種「無效值」的情況,即沒有任何有效值得情況。
程式設計客棧boolean(布林)
boolean型別有兩個可選值:false和true。一定需要注意的是,在lua中只有false和nil是「假」的,而除此之外的都是「真」,這和其它語言有所區別的。我之前有乙個同事,就吃過這個虧。
number(數字)
number型別用於表示雙精度浮點數。lua沒有整數型別,而lua中的數字可以表示任何32位整數。
string(字串)
lua中的字串通常表示「乙個字串行」。lua完全採用8位編碼。lua的字串是不可變的值。不能像c語言中那樣直接修改字串的某個字元,而是應該根據修改要求來建立乙個新的字串。lua的字串和其它物件都是自動記憶體管理機制所管程式設計客棧理的物件,不需要擔心字串的記憶體分配和釋放。在lua中,字串可以高效的處理長字串。當字串是多行存在時,可以使用「」符號來界定乙個多行字串,同時,lua不會解釋其中的轉義序列。例如:
local page = [[
***x
]]print(page)
table(表)
table型別實現了關聯陣列,關聯陣列是一種具有特殊索引方式的陣列;不僅可以通過整數來索引它,還可以使用字串或其它型別的值(除了nil)來索引它。此外,table沒有固定的大小,可以動態得新增任意數量的元素到乙個table中。
在lua中,table既不是「值」,也不是「變數」,而是物件。可以將table想象成一種動態分配的物件,程式中僅僅有乙個隊它們的引用(指標)。table的建立是通過「構造表示式」完成的,最簡單的構造表示式就是{}。
table永遠是匿名的,乙個引用table的變數與table自身之間沒有固定的關聯性,例如以下**:
local a = {} -- 建立乙個table,並將它的引用儲存在a
a["x"] = 10
local b = a -- b與a引用同乙個table
print(b["x"])
b["x"] = 20
print(a["x"])
b = nil -- 現在只有a還在引用table
-- 錯誤:print(b["x"])
print(a["x"])
a = nil -- 現在不存在對table的引用
當對乙個table的引用為0時,lua的垃圾收集器最終會刪除該table,並釋放它所占用的記憶體空間。當table的某個元素沒有初始化時,它的內容就是nil;另外還可以像全域性變數一樣,將nil賦予table的某個元素來刪除該元素。
在lua中,對於a["name"]這種形式的寫法提供了一種更簡便的寫法,可以直接輸入a.name。先看看以下**:
local a = {} -- 建立乙個table,並將它的引用儲存在a
a["x"] = 10
local b = a -- b與a引用同乙個table
print(b["x"])
b["x"] = 20
print(a["x"])
b = nil -- 現在只有a還在引用table
-- 錯誤:print(b["x"])
print(a["x"])
a = nil -- 現在不存在對table的引用
這種寫法本身提供了簡便性,但是有的時候,卻給程式設計師帶來了困惑;我就常常會把a.x和a[x]搞錯,a.x表示a["x"],表示以字串」x」來索引table;而a[x]是以變數x的值來索引table。通過下面這段**,來看看它們之間的區別:
local a = {}
a["name"] = 10
print(a.name) -- 等價於print(a["name"])
在lua 5.1中,長度操作符「#」用於返回乙個陣列或線性表的最後乙個索引值。在實際專案中,我們經常使用該操作符來獲取陣列或線性表的長度。但是使用該操作符是存在陷阱的,比如下面一段**:
local a = {}
x= "y"
a[x] = 10
print(a[x]) -->10 相當於a["y"]
print(a.x) -->nil 相當於a["x"]
print(a.y) -->10 相當於a["y"]
這該輸出多少呢?
在lua中,對於所有未初始化的元素的索引結果都是nil。lua將nil作為界定陣列結尾的標誌。當乙個陣列有「空隙」時,即中間含有nil時,長度操作符會認為這些nil元素就是結尾標記。因為a[1] = nil,所以,對於上述**的輸出應該是0。所以,在處理table的時候,需要考慮這個問題。那麼對於含有nil的table,如何獲取它的長度呢?我們可以使用table.maxn,它將返回乙個table的最大正索引數,如下所示:
local a = {}
a[1000] = 1
print(table.maxn(a)) -->1000
function(函式)
在lua中,函式被當做值來對待,這表示函式可以儲存在變數中,可以通過引數傳遞給其它函式,還可以作為其它函式的返回值。lua既可以呼叫自身lua語言編寫的函式,又可以呼叫以c語言編寫的函式。lua所有的標準庫都是用c語言寫的。我在之後,還會詳細的總結lua中的函式的。在這裡就說這麼多。
userdata(自定義型別)和thread(執行緒)
userdata用於表示一種由應用程式或c語言庫所建立的新型別。由於userdata型別可以將任意的c語言資料儲存到lua變數中。在lua中,這種型別沒有太多的預定義操作,只能進行賦值和相等性測試。
thread主要用於「協同程式」。
總結本文標題: lua學習筆記之型別與值
本文位址:
Lua 筆記 型別與值
lua是一種動態型別的語言。在lua中有8種基礎型別 nil 空 boolean 布林 number 數字 string 字串 userdata 自定義型別 function 函式 thread 執行緒 和table 表 print type hello world string print typ...
LUA型別與值
lua是一種動態型別語言,語言中沒有型別定義的語法,每個值都攜帶有自身的型別資訊。lua中有8個基礎型別 nil 空 boolean 布林值 number 數字 string 字串 table 表 function 函式 userdata 自定義型別 和thread 執行緒 用type函式可以返回其...
(二)Lua型別與值
lua有八種基礎型別 nil 空 boolean 布林 number 數字 string 字串 userdata 使用者自定義 function 函式 thread 執行緒 and table 表 nil是一種型別,他只有nil乙個值,相當於無效值。全域性變數在第一次賦值前預設值就是nil,也就是說...