lua是一款小巧的腳本語言,是巴西里約熱內盧天主教大學裏的一個研究小組於1993年開發其設計目的是爲了嵌入應用程序中,從而爲應用程序提供靈活的擴展和定製功能。lua由標準C編寫而成,幾乎在所有操作系統和平臺上都可以編譯、運行。lua並沒有提供強大的庫,這是由它的定位決定的,所以lua不適合作爲開發獨立應用程序的語言,在遊戲開發等領域使用較多。
1. 引子
1.1 保留字
保留字的概念不用多說,lua
中的保留字如下21個:
and break do else elseif end false for function if in local nil not or repeat return then true until while
1.2 註釋
註釋分爲行註釋和塊註釋:
-- 行註釋 -- print("the line notes") -- 塊註釋 --[[ print("the first block notes") print("the second block notes") ]]
使用塊註釋時,建議用如下形式:
--[[ print("the first block notes") print("the second block notes") --]]
這種形式的好處是,如果想要取消塊註釋,只需在塊註釋開始前再加一個-
符號,如此可以將塊註釋的開始行和結束行都變爲行註釋:
---[[ print("the first block notes") print("the second block notes") --]]
這裏還要提到的一點是,如果在被註釋的內容中出現]]
的解決方法。在lua
5.1版本後,可以通過在兩個相連的中括號間添加相等數量的=
來解決,如此便可在註釋內容中使用]]
:
--[===[ print("the first block notes") print("the second block notes") [[ ]] --]===]
1.3 shebang
和shell
,python
一樣,在lua
中也有shebang,放於.lua
文件的第一行,如果改文件有執行權限,則可以直接執行:
#!/bin/bash #!/usr/bin/env lua
2. 類型與值
lua
中共有8種基礎類型:
nil boolean number string userdata function thread table
nil即爲空,相當於python
中的None和JavaScript
中的undefined/null,比較簡單;userdata爲自定義變量,thread與多線程、併發有關,這兩種變量不必在初學階段做過多糾結,下面我們主要看看number,boolean,string,table和function。
2.1 判斷值的類型:
內置的type()
函數可以返回變量或值的類型:
print(type(nil)) --nil print(type(true)) --boolean print(type(12.2)) --number print(type("hello")) --string print(type(print)) --function print(type(type(nil))) --string 此處無論type中的是何值,print出的都是string,因爲type()的返回值是string類型
2.2 lua中的number
lua
中沒有像C/C++/Java中的整型(int/Integer),所有的數字均爲雙精度浮點數(double/Double)。在lua
中可以使用科學計數法表示數字常量,下面幾種寫法都是允許的:
4 3.1 6.6e+5 2.5e-3
2.3 lua中的boolean
lua
中的boolean值和python
和JavaScript
中的boolean有些區別。在python
和JavaScript
中,None/null,空字符串和數字0在邏輯判斷中都會轉換爲false,而在lua
中,空字符串和數字0在邏輯判斷中都會轉換爲true,只有nil在邏輯判斷中都會轉換爲false:
if "" and 0 then print(true) else print(false) end --[[ 輸出結果爲true --]]
2.4 lua中的string
lua
中的字符串是不可變量,這和python
中相同,與C/C++/Java中不同。與python
和JavaScript
一樣,lua
中既可以使用單引號'
,也可以使用雙引號"
來聲明字符串:
stringA = "This is string A" stringB = 'The string B'
lua
中也有轉義字符,如定義一個分爲兩行的字符串:
stringTwoLine = "This is the first line.\nThe second line."
在lua
中,可以使用一對匹配的` `
來界定一個字符串,如果此時該字符串的第一個字符是換行符,該換行符將會被lua
忽略,此外在該字符串中所有的轉義字符如\n
\t
等都會被忽略,即所有的轉義字符在` `
內失效。該用法通常用來書寫含有代碼的字符串:
indexPage = [[ <html> <head> <title>HTML Title</title> </head> <body> <div>Hello World</div> </body> </html>]] print(indexPage)
與其他大多數編程語言不同,lua
中不能使用+
來連接字符串,而要用..
來進行連接:
> print("hello" + " world") stdin:1: attempt to perform arithmetic on a string value stack traceback: stdin:1: in main chunk [C]: ? > print("hello".." world") -- 輸出結果hello world
lua
中計算字符串長度有些新奇,這裏對比python
和JavaScript
來看一下,方便加深印象:
len('helloworld') # python 'helloworld'.length // JavaScript #'helloworld' -- lua
lua
中有兩個內置函數tonumber()
、tostring()
用於將string轉換爲number及將number轉換爲string,在轉換失敗時不會拋出異常,而是將其轉換爲nil:
tonumber('1.173') -- 1.173 tonumber('hello') -- nil tostring(3.14159) -- '3.14159'
2.5 lua中的table
table是lua
中僅有的數據結構機制。table非常類似於python
中的dict,只要hashable的值均可作爲key的,可以簡單的認爲string和number均可作爲key,如:
dataTable, newTable = {}, {} -- 初始化table dataTable["name"] = "jiagoushi" -- 賦值,key="name",value="jiagoushi" print(dataTable["name"]) -- 取值,值爲"jiagoushi" print(dataTable.name) -- 另一種取值方式,值爲"jiagoushi" dataTable[1] = 233 print(dataTable[1]) -- 取值,值爲233 dataTable[2.2] = "Beijing" print(dataTable[2.2]) -- 取值,值爲"Beijing" print("dataTable的長度爲 " .. #dataTable) -- 與取string長度相同,#也可以用來取table的長度 for i = 1, 10 do newTable[i] = i * 2 end for j = 1, #newTable do -- 循環輸出該table中的值 print("newTable[" .. j .. "] = " .. newTable[j]) end
關於lua
中table的key值,如果使用整數的話,通常會以1作爲起始值,這點與絕大多數編程語言習慣從0開始不同,因爲lua
中有不少機制依賴該慣例,因此應該多加註意。
2.5 lua中的function
與python
和JavaScript
相同,在lua
中,函數被視爲第一類值,可以被自由傳遞。看一下函數的基本用法:
-- 函數定義,有一個形參name function sayHello(name) print("Hello, " .. name) end -- 函數調用 sayHello("Li Lei") -- "Hello, Li Lei" sayHello("Han Meimei") -- "Hello, Han Meimei"
有關函數的高階內容,放到之後的博客中繼續講解,敬請關注。
完。