1. 程式人生 > >【Lua學習筆記】2:變數,多變數賦值,table索引,各類迴圈

【Lua學習筆記】2:變數,多變數賦值,table索引,各類迴圈

變數

Lua中變數分為全域性變數、區域性變數、table中的域。如果不用local顯式宣告,即使是在函式內部的變數,仍然是全域性變數。如:

function myfun()
    a=1 --全域性變數
    print("a="..a.."建立了!")
end
myfun() --不過函式中的變數顯然要呼叫過這個函式才會建立

local b=2   --區域性變數

c={"啊","嗯嗯"}
c[2]="呵呵"   --table域

print("a="..a..",b="..b..",c[2]="..c[2])

輸出:

a=1建立了!
a=1,b=2,c[2]=呵呵

多變數賦值

Lua支援多變數賦值,支援賦值號左右數目不一致(以左側為準)。如:

a=1;
b=2;
c=3;
--輪換a,b,c的值
a,b,c=b,c,a;
print(a.." "..b.." "..c);


--這樣會編譯錯誤
--[[
a,b,c=1,2;
print(a.." "..b.." "..c);
]]--

--5,6都被忽略
a,b=3,4,5,6;
print(a.." "..b.." "..c);

輸出:

2 3 1
3 4 1

Lua中可以省略語句結尾的分號,就像之前那樣。大部分時候肯定是喜歡簡潔的形式,有的地方又為了結構清晰嚴謹需要打上分號,可以混著來用。

table索引

table的索引(table變數[key名])實際是在呼叫一個底層的函式來獲取索引值。當key是string型別時,獲取還可以寫成table變數.key名的形式。如:

lzh={}
lzh["age"]=21
print(lzh["age"])
print(lzh.age) --不用帶引號

輸出:

21
21

各類迴圈

while迴圈

格式:

while(condition)
do
   statements
end

標準for迴圈

格式:

--三個表示式只在for啟動前求值一次
for 變數=初始值(表示式),退出值(表示式),步長(表示式,省略則為1
) do statements end

如:

function myfun()
    return 3
end

--在啟動前求值得myfun()-1為2
for i=5,myfun()-1,-1 do
    print(i)
end

輸出:

5
4
3
2

迭代器for迴圈

上篇中使用過了pairs()函式來得到一個table變數的迭代器,除此之外還可以使用ipairs()函式來遍歷,兩者有些不同,網上找到了一種解讀

pairs可以遍歷表中所有的key,並且除了迭代器本身以及遍歷表本身還可以返回nil。
ipairs不能返回nil,只能返回數字0,如果遇到nil則退出。它只能遍歷到表中出現的第一個不是整數的key。

如:

a={"第一個","第二個"}
a["three"]="第三個"
a[4]="第四個"

--pairs
for k,v in pairs(a) do
    print(k..":"..v)
end

print()

--ipairs
for k,v in ipairs(a) do
    print(k..":"..v)
end

輸出:

1:第一個
2:第二個
4:第四個
three:第三個

1:第一個
2:第二個

repeat-until迴圈

格式:

repeat
   statements
until(condition)

很多程式語言都沒有在語法層面實現這種迴圈,它完全可以被其它迴圈代替掉。但有時候用它可以讓邏輯上更清楚。