開篇
1、幾個連續(xù)語句之間不需要分割符,但也可以使用分號分割。 比如: a = 1 b = 2等價于a = 1; b= 2
2、lua解釋器對于大型程序塊處理不會有任何問題。
3、在交互模式中執(zhí)行代碼 或 將程序代碼保存到一個文件中再執(zhí)行,退出交互模式:調(diào)用os.exit(),或輸入 end of file控制符(windows上是ctrl + z, unix上是Ctrl + d)。
4、lua -i hello.lua :-i參數(shù),會讓先執(zhí)行hello中的代碼,然后進(jìn)入交互模式。
5、dofile(filename):加載程序庫(執(zhí)行文件中的代碼)
6、lua區(qū)分大小寫,名字和java語法相似。
7、lua的注釋,行注釋:--;多行注釋:--[[ 代碼 --]]
8、lua的全局變量:訪問一個未初始化的變量不會引發(fā)錯誤,訪問結(jié)果是一個特殊值 nil,刪除每個變量執(zhí)行將其賦值為nil
9、lua解釋器執(zhí)行程序:lua [選項參數(shù)] [腳本[參數(shù)]]
-e:可以直接在命令行輸入代碼
-l:加載庫文件
-i:運行完代碼,進(jìn)入交互模式
類型與值
10、lua有8中基礎(chǔ)類型:
nil(空):表示無效,
boolean(布爾):true or false;lua將false和nil視為假,0和空字符串視為真,
number(數(shù)字):實數(shù),lua沒有整數(shù)和浮點數(shù)之分,可以使用科學(xué)計算法、
string(字符串):lua字符串是不可變值,不能直接修改字符串中的某個字符,而應(yīng)該創(chuàng)建一個新的字符串,
a = "one string";
b = string.gsub(a, "one", "anothor");
字符串可以使用單引號或雙引號;包含類型C語言的轉(zhuǎn)義;多行字符串([[ "" ]]):
page = [[
<html>
<head>
</head>
</html>
]];
字符串連接:.. ,例如
print(10 .. 20);
轉(zhuǎn)換字符串:tostring(10);
字符串長度:在字符串前面放置操作符“#”獲取字符串長度,
print(#str)
userdata(自定義類型):userdata用于表示一種由應(yīng)用程序或C創(chuàng)建的新類型,標(biāo)準(zhǔn)IO庫就用userdata表示文件的,可以將任意C數(shù)據(jù)存儲到lua變量中、
function(函數(shù)):可以存儲在變量中,可以通過參數(shù)傳遞給其它函數(shù),可以作為其它函數(shù)的返回值;lua所有的標(biāo)準(zhǔn)庫都是用C寫的,lua和C可以互調(diào)、
thread(線程):后面再講、
table(表):--[[
是一個關(guān)聯(lián)數(shù)組,“關(guān)聯(lián)數(shù)組”是一種具有特殊索引方式的數(shù)組;
大小可變;
lua通過table表示模塊、包、對象。io.read 表示 io模塊中的read函數(shù),而對于lua這表示使用字符串“read”作為key來索引table io;
table是對象,可以看做一個“匿名對象”,lua不會暗中產(chǎn)生table的副本或創(chuàng)建新的table,僅持有一個引用;
創(chuàng)建空table:a = {};最簡單的表達(dá)式就是“{}”;
table變量與table自身之間沒有固定的關(guān)聯(lián)性,屬性可以自由的加入和取出;添加或修改:a["x"] = 10; 刪除:a["x"] = nil;
--[[
a = {}
x = "y"
a[x] = 10
]]
a["y"] 等價于 a.y;a.y表示key為y來索引table;
表示數(shù)組和線性表:用整數(shù)作為key來使用table;自動生成的索引從1開始;
數(shù)組或線性表的長度獲?。骸?”操作符,和字符串用法一致,Lua將nil作為界定數(shù)組結(jié)尾的標(biāo)志,如果數(shù)組有中間含有nil時,操作符會認(rèn)為這些nil元素就是結(jié)尾標(biāo)志;
返回table的最大正索引數(shù):table.maxn;
]]
11、print(type(a)):打印變量類型。
表達(dá)式
12、算術(shù)操作符:和其它語言基本一致。
13、關(guān)系操作符:和其它語言唯一區(qū)別是“!=” 變成了 “~=”;table、userdata和函數(shù)都是做“引用比較”,只有當(dāng)它們引用引用同一個對象時,才認(rèn)為它們相等;除字符串和數(shù)字之外的其它類型只能相等或不等比較;不同類型之間大小比較直接導(dǎo)致錯誤;
14、邏輯操作符(and,or,not):與條件控制語句一致,所有邏輯操作符將false和nil視為假,其它任何東西視為真;操作符規(guī)則和其它語言一致;
15、操作符優(yōu)先級:“^”和“..”是右結(jié)合,其它都是左結(jié)合。
16、table的構(gòu)造:
空構(gòu)造:a = {}
構(gòu)造數(shù)組:a = {"1", "2", "3", "4", "5"}
a = {x = 10, y = 20}等價于 a = {}; a.x = 10; a.y = 20
添加屬性:a.x = 1,如果table a中有key為“x”的屬性,該語句為修改,如果沒有就會添加“x”到table中。(有點像JavaScript那么隨意)
刪除屬性:a.x = nil
初始化方式嵌套:
a = {name = "android", {x = 1, y = 2}, {x = 3, y = 4}}
訪問:
a.name ---> android
a["name"] ---> android
a[1] ---> 1
table可以在最后一個元素后面寫一個逗號;可以用“;”“,”分隔元素
{x = 1, y = 2, "x"; "y", }
語句
17、多重賦值:
a, b, c = 1, 2
x, y = y, x
若值的個數(shù)少于變量個數(shù),那么多余的變量會被賦為nil;若值的個數(shù)更多的話,那么多余的值會被直接丟棄掉;
18、局部變量:local修飾變量, 例:local a = 1;
19、顯示的定義一個程序塊:使用關(guān)鍵字:do - end
do
local a = 1
local d = a*2
c = a+b
end
20、控制語句,lua不支持switch語句
if - elseif - else - end
if a>0 then
a=1
end
if a>0 then
a = 1
else
a = -1
end
if a>0 then
a = 1
elseif a == 0 then
a = -1
else
a = 0
end
while
local i = 1
while a[i] do
print(a[i])
i = i+1
end
repeat - until
repeat
line = io.read()
until line ~= ""
local sqr = x/2
repeat
sqr = (sqr + x/sqr)/2
local error = math.abs(sqr^2 - x)
until error < x/10000 --在這里還能訪問循環(huán)體中的局部變量
21、for
for i=exp1,exp2,exp3 do
print(i)
end
表示 i 從exp1變化到exp2,每次都以exp3作為步長遞增,exp3可缺省則默認(rèn)為1,并執(zhí)行一個“執(zhí)行體”。
exp1,exp2,exp3都是在循環(huán)開始前一次性求值,只會執(zhí)行一次;控制變量 i 會被自動什么為for語句的局部變量,僅在循環(huán)體內(nèi)可見。
22、泛型for
for i,v in ipairs(table_name) do
print(i,v)
end
迭代器ipairs,用于遍歷數(shù)組的迭代器函數(shù),每次在循環(huán)中,i 會被賦予一個索引值,同時 v 被賦予對應(yīng)的元素值。
23、break 與 return
break:結(jié)束當(dāng)前循環(huán)
return:結(jié)束當(dāng)前程序塊,只能放在end、else、until前一條,其它地方要么不起作用,要么報錯。
function fun()
return --這里不起作用
do
return --這樣就可以不執(zhí)行函數(shù)后面的語句,直接跳出函數(shù)了
end
print("hello lua")
end