Lua探路(1):語言基礎

類型與值

基礎類型

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章