【Lua語法要點】html
一、註釋。編程
1)單行註釋。數組
--
2)多行註釋。app
--[[ 多行註釋 多行註釋 --]]
二、標識符。編程語言
Lua 標示符以一個字母 A 到 Z 或 a 到 z 或下劃線 _ 開頭後加上0個或多個字母,下劃線,數字(0到9)。 ide
最好不要使用下劃線加大寫字母的標示符,由於Lua的保留字也是這樣的。 函數
Lua 不容許使用特殊字符如 @, $, 和 % 來定義標示符。this
Lua 是一個區分大小寫的編程語言。所以在 Lua 中 Runoob 與 runoob 是兩個不一樣的標示符。lua
三、全局變量。spa
在默認狀況下,變量老是認爲是全局的。
全局變量不須要聲明,給一個變量賦值後即建立了這個全局變量,訪問一個沒有初始化的全局變量也不會出錯,只不過獲得的結果是:nil。
> print(b) nil > b=10 > print(b) 10 >
若是你想刪除一個全局變量,只須要將變量賦值爲nil。
b = nil print(b) --> nil
這樣變量b就好像從沒被使用過同樣。換句話說, 當且僅當一個變量不等於nil時,這個變量即存在。
四、Lua 有8種基本數據類型。
print(type("Hello world")) --> string print(type(10.4*3)) --> number print(type(print)) --> function print(type(type)) --> function print(type(true)) --> boolean print(type(nil)) --> nil print(type(type(X))) --> string
五、nil
nil 類型表示一種沒有任何有效值,它只有一個值 -- nil,例如打印一個沒有賦值的變量,便會輸出一個 nil 值:
> print(type(a)) nil >
對於全局變量和 table,nil 還有一個"刪除"做用,給全局變量或者 table 表裏的變量賦一個 nil 值,等同於把它們刪掉,執行下面代碼就知:
tab1 = { key1 = "val1", key2 = "val2", "val3" } for k, v in pairs(tab1) do print(k .. " - " .. v) end tab1.key1 = nil for k, v in pairs(tab1) do print(k .. " - " .. v) end
type() 的返回值是 string,因此在與 nil 比較時要加上雙引號""。
> type(X) nil > type(X)==nil false > type(X)=="nil" true >
六、boolean
boolean 類型只有兩個可選值:true(真) 和 false(假),Lua 把 false 和 nil 看做是"假",其餘的都爲"真":
print(type(true)) print(type(false)) print(type(nil)) if false or nil then print("至少有一個是 true") else print("false 和 nil 都爲 false!") end
$ lua test.lua boolean boolean nil false 和 nil 都爲 false!
七、number
Lua 默認只有一種 number 類型 -- double(雙精度)類型(默認類型能夠修改 luaconf.h 裏的定義),如下幾種寫法都被看做是 number 類型:
print(type(2)) print(type(2.2)) print(type(0.2)) print(type(2e+1)) print(type(0.2e-1)) print(type(7.8263692594256e-06))
number
number
number
number
number
number
八、字符串由一對雙引號或單引號來表示。
string1 = "this is string1" string2 = 'this is string2'
也能夠用 2 個方括號 "[[]]" 來表示"一塊"字符串。
html = [[ <html> <head></head> <body> <a href="http://www.runoob.com/">菜鳥教程</a> </body> </html> ]] print(html)
在對一個數字字符串上進行算術操做時,Lua 會嘗試將這個數字字符串轉成一個數字:
> print("2" + 6) 8.0 > print("2" + "6") 8.0 > print("2 + 6") 2 + 6 > print("-2e2" * "6") -1200.0 > print("error" + 1) stdin:1: attempt to perform arithmetic on a string value stack traceback: stdin:1: in main chunk [C]: in ? >
以上代碼中"error" + 1執行報錯了,字符串鏈接使用的是 .. ,如:
> len = "www.runoob.com" > print(#len) 14 > print(#"www.runoob.com") 14 >
九、table(表)
-- 建立一個空的 table local tbl1 = {} -- 直接初始表 local tbl2 = {"apple", "pear", "orange", "grape"}
Lua 中的表(table)實際上是一個"關聯數組"(associative arrays),數組的索引能夠是數字或者是字符串。
-- table_test.lua 腳本文件 a = {} a["key"] = "value" key = 10 a[key] = 22 a[key] = a[key] + 11 for k, v in pairs(a) do print(k .. " : " .. v) end
$ lua table_test.lua key : value 10 : 33
在 Lua 裏表的默認初始索引通常以 1 開始。
-- table_test2.lua 腳本文件 local tbl = {"apple", "pear", "orange", "grape"} for key, val in pairs(tbl) do print("Key", key) end
$ lua table_test2.lua Key 1 Key 2 Key 3 Key 4
table 不會固定長度大小,有新數據添加時 table 長度會自動增加,沒初始的 table 都是 nil。
-- table_test3.lua 腳本文件 a3 = {} for i = 1, 10 do a3[i] = i end a3["key"] = "val" print(a3["key"]) print(a3["none"])
$ lua table_test3.lua val nil
十、匿名函數(anonymous function)
-- function_test2.lua 腳本文件 function testFun(tab,fun) for k ,v in pairs(tab) do print(fun(k,v)); end end tab={key1="val1",key2="val2"}; testFun(tab, function(key,val)--匿名函數 return key.."="..val; end );
$ lua function_test2.lua key1 = val1 key2 = val2
十一、thread(線程)
在 Lua 裏,最主要的線程是協同程序(coroutine)。它跟線程(thread)差很少,擁有本身獨立的棧、局部變量和指令指針,能夠跟其餘協同程序共享全局變量和其餘大部分東西。
線程跟協程的區別:線程能夠同時多個運行,而協程任意時刻只能運行一個,而且處於運行狀態的協程只有被掛起(suspend)時纔會暫停。
十二、userdata(自定義類型)
userdata 是一種用戶自定義數據,用於表示一種由應用程序或 C/C++ 語言庫所建立的類型,能夠將任意 C/C++ 的任意數據類型的數據(一般是 struct 和 指針)存儲到 Lua 變量中調用。
1三、Lua 變量
Lua 變量有三種類型:全局變量、局部變量、表中的域。
Lua 中的變量全是全局變量,那怕是語句塊或是函數裏,除非用 local 顯式聲明爲局部變量。
局部變量的做用域爲從聲明位置開始到所在語句塊結束。
變量的默認值均爲 nil。
-- test.lua 文件腳本 a = 5 -- 全局變量 local b = 5 -- 局部變量 function joke() c = 5 -- 全局變量 local d = 6 -- 局部變量 end joke() print(c,d) --> 5 nil do local a = 6 -- 局部變量 b = 6 -- 對局部變量從新賦值 print(a,b); --> 6 6 end print(a,b) --> 5 6
$ lua test.lua 5 nil 6 6 5 6
1四、賦值語句
Lua 能夠對多個變量同時賦值,變量列表和值列表的各個元素用逗號分開,賦值語句右邊的值會依次賦給左邊的變量。
a, b = 10, 2*x <--> a=10; b=2*x
遇到賦值語句Lua會先計算右邊全部的值而後再執行賦值操做,因此咱們能夠這樣進行交換變量的值:
x, y = y, x -- swap 'x' for 'y' a[i], a[j] = a[j], a[i] -- swap 'a[i]' for 'a[j]'
a, b, c = 0, 1 print(a,b,c) --> 0 1 nil a, b = a+1, b+1, b+2 -- value of b+2 is ignored print(a,b) --> 1 2 a, b, c = 0 print(a,b,c) --> 0 nil nil
1五、索引
對 table 的索引使用方括號 []。Lua 也提供了 . 操做。
--t[i] --t.i -- 當索引爲字符串類型時的一種簡化寫法 --gettable_event(t,i) -- 採用索引訪問本質上是一個相似這樣的函數調用 > site = {} > site["key"] = "www.runoob.com" > print(site["key"]) www.runoob.com > print(site.key) www.runoob.com
1六、while循環
while( true ) do print("循環將永遠執行下去") end
1七、if 語句
Lua認爲false和nil爲假(其餘都爲真,包括0),true和非nil爲真。要注意的是Lua中 0 爲 true:
--[ 0 爲 true ] if(0) then print("0 爲 true") end
if、elseif 後面必須跟着一個 then。注意,Lua中沒有使用中括號{}來限制範圍,而是使用 then end 來限定範圍。
if( 布爾表達式 1) then --[ 在布爾表達式 1 爲 true 時執行該語句塊 --] elseif( 布爾表達式 2) then --[ 在布爾表達式 2 爲 true 時執行該語句塊 --] elseif( 布爾表達式 3) then --[ 在布爾表達式 3 爲 true 時執行該語句塊 --] else --[ 若是以上布爾表達式都不爲 true 則執行該語句塊 --] end
1八、
1九、
20、