初始Lua
???????Lua是一種輕量小巧的腳本語言,他使用標準C語言編寫并以源代碼形式開放。這意味著Lua虛擬機可以很方便的嵌入別的程序中,從而為應用程序提供靈活的擴展和定制功能。同時,在目前腳本引擎中,Lua的運行速度占有絕對優勢。
變量
number變量(這個類型與C語言的double類型類似)
???????變量,可以看做是一個桶,在里面裝入自己想裝的內容。這些內容可以是Lua包含的所有合法類型。例如,我想創建一個變量,里面放入920這個數字:
bucket = 920 (全局變量)
???????不過,這樣寫的話,這個變量是全局變量,在其他文件也可以使用到。如果我們只想在本文件下使用,我們可以使用local修飾變量,如下所示:
local bucket = 920
了解nil(與null類似)
???????nil類型表示沒有任何有效值,只要是沒有生命的值,他就是nil。比如打印一個沒有創建的變量,就會輸出nil:
ccc = 233
print(ccc)
print(aaa) --nil
在Lua中,nil和0是有區別的:
含義差異:
- nil:在Lua中,nil是一種特殊的數據類型,他只有一個值,也就是nil。nil一般用于表示一個變量未被賦值或者某個值不存在。
- 0:0屬于數字類型,代表數值零,在數字運算以及邏輯判斷等場景中使用
邏輯判斷中的表現:
- 在條件判斷里,除了?
nil
?和?false
?會被視為假,其他值(包含?0
)都被視為真。下面是示例代碼:-- 判斷0和nil在條件判斷中的表現 if 0 thenprint("0在條件判斷中被視為真") elseprint("0在條件判斷中被視為假") endif nil thenprint("nil在條件判斷中被視為真") elseprint("nil在條件判斷中被視為假") end
賦值和使用情況:
nil
:當一個變量被賦值為?nil
?時,就相當于將這個變量刪除,后續若使用該變量就會引發錯誤(除非再次賦值)。0
:0
?是一個正常的數值,可用于各種數學運算和邏輯操作。
賦值語句
賦值是改變一個變量值的最基本的方法,如下面一樣,使用等號對左邊的變量進行賦值。
n = 2
n = 3
n = n + 1
b = n
注意:在 Lua 里,并沒有像 C、Java 這類語言中使用的?
++
?自增運算符,也沒有?n += 1
?這種復合賦值運算符。不過,你可以使用其他方式來實現相同的功能。
?Lua可以對多個變量同時賦值,變量使用逗號分開,賦值語句右邊的值會依次賦值給左邊的變量。
n = 1
a, b = 10, 2*n
當左右值的數量不一致時,Lua會進行下面的設定:
- 變量個數 > 值的個數:按變量個數補足nil
- 變量個數 < 值的個數:多余的值會被忽略
a, b, c = 0, 1
print(a,b,c)
--輸出0 1 nila, b = a+1, b+1, b+2
print(a,b)
--輸出1 2a, b, c = 0
print(a,b,c)
--輸出0 nil nil
數值型
???????在Lua中,數值型(number)是一種基本的數據類型,用于表示數字。下面從多個方面對Lua中的數值型進行介紹:
表示范圍
???????在 Lua 5.3 及之后的版本中,數值型默認采用雙精度浮點數(64 位)來表示,能夠表示非常大或者非常小的數。其表示范圍大致為 ±1.8×10^308 ,精度約為 15 - 17 位十進制數字。而在早期的 Lua 版本中,數值型使用的是雙精度浮點數或者整數(取決于編譯選項)。
整數和浮點數
???????在 Lua 5.3 及后續版本中,數值型可以表示整數和浮點數。
整數
可以直接使用沒有小數點的數字來表示整數,例如:
local num1 = 10
local num2 = -20
浮點數
使用帶小數點或者科學計數法的數字來表示浮點數,例如:
local num3 = 3.14
local num4 = 1.23e-5 -- 表示1.23×10^(-5)
類型判斷
可以使用?type()
?函數來判斷一個變量是否為數值型,示例如下:
local num = 5
if type(num) == "number" thenprint("num是數值型")
end
數字運算
???????數值型變量能夠進行常見的數學運算,例如加(+
)、減(-
)、乘(*
)、除(/
)、取模(%
)、冪運算(^
)等,示例代碼如下:
local a = 10
local b = 3
local sum = a + b
local difference = a - b
local product = a * b
local quotient = a / b
local remainder = a % b
local power = a ^ bprint("和: ", sum)
print("差: ", difference)
print("積: ", product)
print("商: ", quotient)
print("余數: ", remainder)
print("冪: ", power)
整數和浮點數的轉換
???????在 Lua 中,整數和浮點數之間可以進行隱式轉換。例如,在進行某些運算時,整數可能會轉換為浮點數:
local num1 = 5
local num2 = 2
local result = num1 / num2 -- 這里結果是浮點數2.5
也可以使用?math.floor()
、math.ceil()
?和?math.modf()
?等函數進行顯式轉換:
local num = 3.14
local floor_num = math.floor(num) -- 向下取整,結果為3
local ceil_num = math.ceil(num) -- 向上取整,結果為4
local integer_part, fractional_part = math.modf(num) -- 分離整數部分和小數部分
特殊數值
???????Lua 中的數值型還包含一些特殊數值,例如?math.huge
?表示正無窮大,-math.huge
?表示負無窮大,0/0
?會得到?nan
(非數值):
local inf = math.huge
local neg_inf = -math.huge
local nan = 0/0print("正無窮大: ", inf)
print("負無窮大: ", neg_inf)
print("非數值: ", nan)
字符串
string類型變量
???????字符串(即string),就是一串文本數據,可以存儲你要的文本。print出的數據就是一個字符串。Lua語言中字符串可以使用以下三種方式來表示:
- 單引號間的一串字符
- 雙引號間的一串字符
- [[ 和 ]]間的一串字符
--雙引號間的一串字符
str1 = "Lua"
--單引號間的一串字符
str2 = 'Lua'
--[[和]]--間的一串字符
str3 = [[Lua]]
str4 = [[使用雙括號時,甚至能包含換行數據
換行了
最后一行]]--輸出所有字符串
print(str1)
print(str2)
print(str3)
print(str4)
轉義字符
???????轉義字符用于表示不能直接顯示的字符,比如后退鍵、回車鍵、等。以?\
?開頭的都是轉義字符,下面時常用的轉義字符格式:
string拼接
???????字符串和字符串可以相加,我們可以使用拼接符號來將兩個獨立的字符串拼起來。我們使用 .. 來表示字符串拼接符號:
print('abc'..'def')
str1 = '123'
str2 = '999'
print(str1..str2)
number和string的轉換
???????我們可以直接將number
類型的變量n
轉換成string
類型的值,這樣就可以拼接了。使用tostring(value)
函數即可實現這一操作:
n = 123
s = 'm/s'result = tostring(n)..s
print(result)
???????我們可以直接將string
類型的變量s
轉換成number
類型的值,這樣就可以計算了。使用tonumber(value)
函數即可實現這一操作:
n = 123
s = '2333'result = tonumber(s) + n
print(result)
函數
local變量
???????全局變量在代碼運行周期從頭到尾,都不會被銷毀,而且隨處都可以調用。當代碼量增加時,很多時候大量新建全局變量會導致內存激增,我們需要一種可以臨時使用、并且可以自動銷毀釋放內存資源的變量,我們可以使用local標志來新建臨時變量,使用local創建一個局部變量,與全局變量不同,局部變量只在被聲明的那個代碼塊內有效。
a = 123
function add()local n = a+2print(n)
end
add()
print(n)
函數參數
???????函數內是可以傳參的,這里傳入的參數等價于在函數內部新建了一個local變量,修改這些數據不會影響外部的數據(除了后面還沒有講到的table類型)
函數返回值
這里需要注意的是,函數可以返回多個值。
table
認識數組
???????數組,使用一個變量名,存儲一系列的值。在Lua中,我們可以使用tables(表)來實現這個功能。在Lua中,table是一個一系列元素的集合,使用大括號進行表示,其中的元素之間以逗號分隔,類似下面的代碼:
t = {1,3,8,5,4}
???????我們可以直接使用元素的下標來訪問,或者對該元素進行賦值操作。在上面的table中,第一個元素的下標是1,第二個是2,依次類推。
簡單table
???????table中可以存儲任意類型的數據,比如,我們可以在table中放置number和string數據,還可以放置函數,類似于下面的代碼:
t = {"abc",223,",..a",123123}t = {function() return 123 end,function() print("abc") end,function(a,b) return a+b end,function() print("hello world") end,
}
t[1]()
t[2]()
t[3](1,2)
t[4]()
這些table訪問每一個元素的方式任然是直接使用下標,并且可以使用下標來進行修改。?
table下標
在Lua中,下標可以直接在聲明時進行指定,像下面這樣:
t = {6,7,8,9}
--上面和下面的代碼等價
t = {[1] = 6,[2] = 7,[3] = 8,[4] = 9,
}--甚至你可以跳過某些下標
t = {[1] = 6,[3] = 7,[5] = 8,[7] = 9,
}
print(t[7])
--輸出9--在聲明后賦予元素值也是可以的
t = {}--空的table
t[101] = 10
print(t[101])
--輸出10
有上面可以自定義下標,那么我們也可以自定義字符串下標,代碼如下所示:
t = {["apple"] = 10,banana = 12,pear = 6,
}
--使用["下標"] = 值
--和 下標 = 值
--都是正確寫法
--當第二種方式有歧義時,應該用第一種方式--可以用下面兩種方式訪問:
print(t["apple"])
--輸出10
print(t.apple)
--輸出10
--當第二種方式有歧義時,應該用第一種方式
Lua全局變量與table
實際上,在Lua中,所有的全局變量全部被存放在了一個大table
中,這個table
名為:_G
table增刪
table.insert (table, [pos ,] value)
???????在(數組型)表 table 的 pos 索引位置插入 value,其它元素向后移動到空的地方。pos 的默認值是表的長度加一,即默認是插在表的最后。
table.remove (table [, pos])
???????在表 table 中刪除索引為 pos(pos 只能是 number 型)的元素,并返回這個被刪除的元素,它后面所有元素的索引值都會減一。pos 的默認值是表的長度,即默認是刪除表的最后一個元素。
邏輯運算
布爾型和比較運算
???????布爾型(boolean)只有兩個可選值:true
(真) 和?false
(假)。Lua 把 false 和 nil 看作是false
,其他的都為true(包括0這個值,也是相當于true
)
Lua 中也有許多的關系運算符
,用于比較大小或比較是否相等,符號及其含義如下表:
邏輯運算符
???????邏輯運算符基于布爾型的值來進行計算,并給出結果,下表列出了 Lua 語言中的常用邏輯運算符:
循環
while循環
while 繼續循環判斷依據 do執行的代碼
end
for循環
for 臨時變量名=開始值,結束值,步長 do循環的代碼
end
中斷循環
???????有些時候循環運行到一半,我們不想再繼續運行了,怎么辦呢?我們可以在一個循環體中使用break
,來立即結束本次循環,繼續運行下面的代碼:
result = 0
for i=1,100 doresult = result + iif result > 100 thenresult = result - ibreakend
endprint(result)