參考Lua的菜鳥教程跪解,這里寫下來是方便自己查閱衙熔。
Lua的關(guān)鍵字
以下列出了 Lua 的保留關(guān)鍵字匀归。保留關(guān)鍵字不能作為常量或變量或其他用戶自定義標(biāo)示符:
and | break | do | else |
---|---|---|---|
elseif | end | false | for |
function | if | in | local |
nil | not | or | repeat |
return | then | true | until |
while | goto |
一般約定项鬼,以下劃線開頭連接一串大寫字母的名字(比如 _VERSION)被保留用于 Lua 內(nèi)部全局變量蜻直。
Lua的注釋
使用 -- 做單行注釋
使用 --[[ --]]做多行注釋
Lua 數(shù)據(jù)類型
Lua 是動(dòng)態(tài)類型語言饵逐,變量不要類型定義,只需要為變量賦值括眠。 值可以存儲(chǔ)在變量中,作為參數(shù)傳遞或結(jié)果返回倍权。
Lua 中有 8 個(gè)基本類型分別為:nil掷豺、boolean、number薄声、string当船、userdata、function默辨、thread 和 table德频。
數(shù)據(jù)類型 | 描述 |
---|---|
nil | 這個(gè)最簡(jiǎn)單,只有值nil屬于該類缩幸,表示一個(gè)無效值(在條件表達(dá)式中相當(dāng)于false)壹置。 |
boolean | 包含兩個(gè)值:false和true。 |
number | 表示雙精度類型的實(shí)浮點(diǎn)數(shù) |
string | 字符串由一對(duì)雙引號(hào)或單引號(hào)來表示 |
function | 由 C 或 Lua 編寫的函數(shù) |
userdata | 表示任意存儲(chǔ)在變量中的C數(shù)據(jù)結(jié)構(gòu) |
thread | 表示執(zhí)行的獨(dú)立線路表谊,用于執(zhí)行協(xié)同程序 |
table | Lua 中的表(table)其實(shí)是一個(gè)"關(guān)聯(lián)數(shù)組"(associative arrays)钞护,數(shù)組的索引可以是數(shù)字、字符串或表類型爆办。在 Lua 里难咕,table 的創(chuàng)建是通過"構(gòu)造表達(dá)式"來完成,最簡(jiǎn)單構(gòu)造表達(dá)式是{},用來創(chuàng)建一個(gè)空表步藕。 |
我們可以使用 type 函數(shù)測(cè)試給定變量或者值的類型:
print(type("Hello"))
注意字符串可以使用單引號(hào)惦界、雙引號(hào)挑格、或者[[ ]]咙冗。最后一個(gè)類似于Python的三引號(hào)字符串。
--table類型用花括號(hào)包裹漂彤,如下
t = {1, '5', ["sss"] = 52, 's'}
--其中可以直接是值或者變量雾消,也可以是鍵值對(duì)的形式,注意索引的時(shí)候下標(biāo)是從1開始的
--且鍵值對(duì)不能使用下標(biāo)訪問
t[1] --是1
t[3] --是's'
t["sss"] --是52
--下面的例子是如果為一個(gè)不存在的索引賦值挫望,將會(huì)創(chuàng)建該索引
a = {}
a[5] = 5
a["zzz"] = "zun"
print(a[5]) --輸出5
print(a["zzz"]) --輸出"zun"
print(a.zzz) --輸出"zun" table中的鍵值可以使用'.'來訪問
--如果給table中的位置立润,或者鍵賦值為nil則表示從table中刪除他們,同樣全局變量也可以如此刪除
lua的字符串使用 '..'連接不是使用加號(hào)媳板。
Lua 中的變量全是全局變量桑腮,那怕是語句塊或是函數(shù)里,除非用 local 顯式聲明為局部變量蛉幸。
局部變量的作用域?yàn)閺穆暶魑恢瞄_始到所在語句塊結(jié)束破讨。
for i = 0, 5, 2
do
local a = 50
end
print(a) --打印為nil 因?yàn)閍是local的,如果去掉local修飾這里就會(huì)打印50奕纫,所以lua要注意只要沒喲local修飾就都是全局變量提陶,不是是聲明在循環(huán)體內(nèi)部還是函數(shù)內(nèi)部
function abs()
c = 2
end
abs()
print(c) --打印為2,當(dāng)然如果函數(shù)不調(diào)用一下的話c還是未定義的
應(yīng)該盡可能的使用局部變量匹层,有兩個(gè)好處:
- 避免命名沖突隙笆。
- 訪問局部變量的速度比全局變量更快。
循環(huán)
Lua中的循環(huán)
a=10
while( a < 20 ) --實(shí)測(cè)這個(gè)小括號(hào)不是必須的去掉也可以
do --do 不能忘
print("a 的值為:", a) --縮進(jìn)只是為了好看不想Python是用來區(qū)分語句塊的
a = a+1 --親測(cè)a++升筏、a += 1 都沒用會(huì)報(bào)錯(cuò)看來都不支持
end
Lua 編程語言中數(shù)值 for 循環(huán)語法格式:
for var=exp1,exp2,exp3 do
<執(zhí)行體>
end
var 從 exp1 變化到 exp2撑柔,每次變化以 exp3 為步長(zhǎng)遞增 var,并執(zhí)行一次 "執(zhí)行體"您访,也就是說如果exp3是一個(gè)函數(shù)的返回值的話這個(gè)函數(shù)只會(huì)被執(zhí)行一次铅忿。exp3 是可選的,如果不指定洋只,默認(rèn)為1辆沦,當(dāng)然可以設(shè)置為負(fù)數(shù),這樣每次都是遞減识虚。
for i=10,1,-1 do --加上小括號(hào)是不行的會(huì)報(bào)錯(cuò)肢扯,同樣do也不能去掉,注意變?yōu)? 的時(shí)候仍然執(zhí)行
print(i)
end
print(i) --打印nil 表明在for里面聲明的i變量是local的
Lua 編程語言中 repeat...until 循環(huán)語法格式:
repeat
statements
until( condition )
我們注意到循環(huán)條件判斷語句(condition)在循環(huán)體末尾部分担锤,所以在條件進(jìn)行判斷前循環(huán)體都會(huì)執(zhí)行一次蔚晨。
這就是do..while了。
a = 10
repeat
print("a的值為:", a)
a = a + 1
until a > 15 --同樣不加小括號(hào)也可以,最好還是加上看起來不費(fèi)勁
控制
a = 2
if (a == 1) --要不要括號(hào)都行最好帶上便于閱讀铭腕,但是then不能缺
then
print(a)
elseif a == 2
then --這個(gè)then也不能缺
print("a is 2")
else --這里就不需要then了
print("This is else.")
end
函數(shù)
定義格式如下:
optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
function_body
return result_params_comma_separated
end
解析:
- optional_function_scope: 該參數(shù)是可選的制定函數(shù)是全局函數(shù)還是局部函數(shù)银择,未設(shè)置該參數(shù)默認(rèn)為全局函數(shù),如果你需要設(shè)置函數(shù)為局部函數(shù)需要使用關(guān)鍵字 local累舷。
- function_name: 指定函數(shù)名稱浩考。
- argument1, argument2, argument3..., argumentn: 函數(shù)參數(shù),多個(gè)參數(shù)以逗號(hào)隔開被盈,函數(shù)也可以不帶參數(shù)析孽。
- function_body: 函數(shù)體,函數(shù)中需要執(zhí)行的代碼語句塊只怎。
- result_params_comma_separated: 函數(shù)返回值袜瞬,Lua語言函數(shù)可以返回多個(gè)值,每個(gè)值以逗號(hào)隔開身堡。
--[[ 函數(shù)返回兩個(gè)值的最大值 --]]
function max(num1, num2)
if (num1 > num2) then
result = num1; --心累邓尤,這語言才發(fā)現(xiàn)加上 ; 結(jié)尾一個(gè)語句和不加都可以運(yùn)行
else
result = num2;
end
return result;
end
-- 調(diào)用函數(shù)
print("兩值比較最大值為 ",max(10,4));
print("兩值比較最大值為 ",max(5,6));
myprint = function(param)
print("這是打印函數(shù) - ##",param,"##")
end
function add(num1,num2,functionPrint) --所以參數(shù)其實(shí)傳入什么都可以,只要可以在函數(shù)內(nèi)使用正確就行
result = num1 + num2
-- 調(diào)用傳遞的函數(shù)參數(shù)
functionPrint(result)
end
myprint(10)
-- myprint 函數(shù)作為參數(shù)傳遞
add(2,5,myprint)
函數(shù)也可以有多個(gè)返回值贴谎,只要使用','隔開就好汞扎。
Lua 函數(shù)可以接受可變數(shù)目的參數(shù),和 C 語言類似赴精,在函數(shù)參數(shù)列表中使用三點(diǎn) ... 表示函數(shù)有可變的參數(shù)佩捞。
function add(...) --可以在函數(shù)內(nèi)使用 a = {...}的語句將可變參數(shù)賦值給變量,這樣就可以操作這個(gè)變量來獲取蕾哟,諸如訪問每一個(gè)參數(shù)一忱,獲取程度等操作
local s = 0
for i, v in ipairs{...} do --> {...} 表示一個(gè)由所有變長(zhǎng)參數(shù)構(gòu)成的數(shù)組
s = s + v
end
return s
end
print(add(3,4,5,6,7)) --->25
我們可以將可變參數(shù)賦值給一個(gè)變量。
通常在遍歷變長(zhǎng)參數(shù)的時(shí)候只需要使用 {…}谭确,然而變長(zhǎng)參數(shù)可能會(huì)包含一些 nil帘营,那么就可以用 select 函數(shù)來訪問變長(zhǎng)參數(shù)了:select('#', …) 或者 select(n, …)
select('#', …) 返回可變參數(shù)的長(zhǎng)度
-
select(n, …) 用于返回 n 到 select('#',…) 的參數(shù)。select(n, ...) --數(shù)字n表示起點(diǎn)逐哈,select(n, ...)返回從起點(diǎn)n到結(jié)束的可變參數(shù)芬迄,比如:
n=3,... 是 0昂秃,1禀梳,2,3肠骆,4算途,5
則 select(n, ...) 就表示...中從第3個(gè)到最后一個(gè)的多個(gè)數(shù):2,3蚀腿,4嘴瓤,5。并且2,3廓脆,4筛谚,5是4個(gè)數(shù),不是列表或其他的數(shù)據(jù)結(jié)構(gòu)停忿。所以驾讲, 下面的代碼中,a = select(3,...) 就表示的是 a = 2,3,4,5瞎嬉。這就相當(dāng)于復(fù)制變量大于值的情況蝎毡,所以厚柳,a=2氧枣。
調(diào)用select時(shí),必須傳入一個(gè)固定實(shí)參selector(選擇開關(guān))和一系列變長(zhǎng)參數(shù)别垮。如果selector為數(shù)字n,那么select返回它的第n個(gè)可變實(shí)參便监,否則只能為字符串"#",這樣select會(huì)返回變長(zhǎng)參數(shù)的總數(shù)。
function mytest(a, ...) --可變實(shí)參和普通參數(shù)可以混用
local t = select('#', ...) --獲取可變實(shí)參的長(zhǎng)度
print(t)
local b = {...}--將可變實(shí)參傳遞給變量碳想,然后通過變量訪問其內(nèi)容烧董,但是這樣如果訪問越界不會(huì)報(bào)錯(cuò)
print(b[1])
end
mytest(5, 6, 7, 8)
do
function foo(...)
for i = 1, select('#', ...) do -->獲取參數(shù)總數(shù)
local arg = select(i, ...); -->讀取參數(shù) 采取這樣的方式可以讀取可變實(shí)參而不會(huì)越界
print("arg", arg);
end
end
foo(1, 2, 3, 4);
end