類型與值
基礎類型
1. nil(空)
表示無效,
2. boolean(布爾)
true or false;lua將false和nil視爲假,0和空字符串視爲真,
3. number(數字)
實數,lua沒有整數和浮點數之分,可以使用科學計算法、
4. string(字符串)
lua字符串是不可變值,不能直接修改字符串中的某個字符,而應該創建一個新的字符串,
a = "one string";
b = string.gsub(a, "one", "anothor");
字符串可以使用單引號或雙引號;包含類型C語言的轉義;多行字符串([[ “” ]]):
page = [[
<html>
<head>
</head>
</html>
]];
字符串連接:.. ,例如
print(10 .. 20);
轉換字符串:tostring(10);
字符串長度:在字符串前面放置操作符“#”獲取字符串長度,
print(#str)
5. userdata(自定義類型)
userdata用於表示一種由應用程序或C創建的新類型,標準IO庫就用userdata表示文件的,可以將任意C數據存儲到lua變量中、
6. function(函數)
可以存儲在變量中,可以通過參數傳遞給其它函數,可以作爲其它函數的返回值;lua所有的標準庫都是用C寫的,lua和C可以互調、
7. thread(線程)
8.table(表)
一個關聯數組,“關聯數組”是一種具有特殊索引方式的數組,大小可變。
lua通過table表示模塊、包、對象。io.read 表示 io模塊中的read函數,而對於lua這表示使用字符串“read”作爲key來索引table io;
table是對象,可以看做一個“匿名對象”,lua不會暗中產生table的副本或創建新的table,僅持有一個引用;
創建空table:a = {};最簡單的表達式就是“{}”;
table變量與table自身之間沒有固定的關聯性,屬性可以自由的加入和取出;添加或修改:a[“x”] = 10; 刪除:a[“x”] = nil;
--[[
a = {}
x = "y"
a[x] = 10
]]
a[“y”] 等價於 a.y;a.y表示key爲y來索引table;
表示數組和線性表:用整數作爲key來使用table;自動生成的索引從1開始;
數組或線性表的長度獲取:“#”操作符,和字符串用法一致,Lua將nil作爲界定數組結尾的標誌,如果數組有中間含有nil時,操作符會認爲這些nil元素就是結尾標誌;
返回table的最大正索引數:table.maxn;
]]
表達式
1. 算術操作符
和其它語言基本一致。
2. 關係操作符
和其它語言唯一區別是“!=” 變成了 “~=”;table、userdata和函數都是做“引用比較”,只有當它們引用引用同一個對象時,才認爲它們相等;除字符串和數字之外的其它類型只能相等或不等比較;不同類型之間大小比較直接導致錯誤;
3. 邏輯操作符(and,or,not)
與條件控制語句一致,所有邏輯操作符將false和nil視爲假,其它任何東西視爲真;操作符規則和其它語言一致;
4. 操作符優先級
“^”和“..”是右結合,其它都是左結合。
table的構造
空構造:
a = {}
構造數組:
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", }
語句
1. 多重賦值
a, b, c = 1, 2
x, y = y, x
若值的個數少於變量個數,那麼多餘的變量會被賦爲nil;若值的個數更多的話,那麼多餘的值會被直接丟棄掉;
2. 局部變量
local修飾變量, 例:local a = 1;
3. 顯示的定義一個程序塊
使用關鍵字:do - end
do
local a = 1
local d = a*2
c = a+b
end
3. 控制語句,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
4. while
local i = 1
while a[i] do
print(a[i])
i = i+1
end
5. 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 --在這裏還能訪問循環體中的局部變量
6. for
for i=exp1,exp2,exp3 do
print(i)
end
表示 i 從exp1變化到exp2,每次都以exp3作爲步長遞增,exp3可缺省則默認爲1,並執行一個“執行體”。
exp1,exp2,exp3都是在循環開始前一次性求值,只會執行一次;控制變量 i 會被自動什麼爲for語句的局部變量,僅在循環體內可見。
7. 泛型for
for i,v in ipairs(table_name) do
print(i,v)
end
迭代器ipairs,用於遍歷數組的迭代器函數,每次在循環中,i 會被賦予一個索引值,同時 v 被賦予對應的元素值。
8. break 與 return
break:結束當前循環
return:結束當前程序塊,只能放在end、else、until前一條,其它地方要麼不起作用,要麼報錯。
function fun()
return --這裏不起作用
do
return --這樣就可以不執行函數後面的語句,直接跳出函數了
end
print("hello lua")
end