Lua 學習筆記(二)—— 語句

Lua 中的語句支持賦值,控制結構,函數調用,還有變量聲明。html

不容許空的語句段,所以 ;; 是非法的。數組

1 語句組 | chuncks

chunck ::= {stat[';']}

([';'] 應該是表示語句組後面 ; 是可選項。)函數

2 語句塊 | blocks

block ::= chunck
stat ::= do block end

能夠將一個語句塊顯式地寫成語句組,能夠用於控制局部變量的做用範圍。測試

3 賦值 | assignment

Lua 支持多重賦值。code

多重賦值時,按序將右邊的表達式的值賦值給左值。右值不足補 nil,右值多餘捨棄。htm

b = 1
a,b = 4 -- a = 4,b = nil

+++blog

Lua 在進行賦值操做時,會一次性把右邊的表達式都計算出來後進行賦值。ip

i = 5
i,a[i] = i+1, 7 -- i = 6 ,a[5] = 7

特別地,有get

x,y = y,x -- 交換 x,y 的值

+++it

對全局變量以及表的域的賦值操做含義能夠在元表中更改。

4 控制結構

4.1 條件語句

if [exp]
    [block]
elseif [exp]
    [block]
else
    [block]
end

4.2 循環語句

while [exp]
    [block]
end

+++

repeat
    [block]
until [exp]

注意,因爲 repeat 語句到 until 還未結束,所以在 until 以後的表達式中能夠使用 block 中定義的局部變量。

例如:

a = 1
c = 5
repeat
    b = a + c
    c = c * 2
until b > 20
print(c)            -->     40

+++

4.3 breakreturn

breakreturn 只能寫在語句塊的最後一句,若是實在須要寫在語句塊中間,那麼就在兩個關鍵詞外面包圍 do end 語句塊。

do break end

5 For 循環

for 循環的用法比較多,單獨拎出來說。

for 中的表達式會在循環開始前一次性求值,在循環過程當中再也不更新。

5.1 數字形式

for [Name] = [exp],[exp],[exp] do [block] end

三個 exp 分別表明初值,結束值,步進。exp 的值均須要是一個數字。
第三個 exp 默認爲 1,能夠省略。

a = 0

for i = 1,6,2 do
    a = a + i
end

等價於

int a = 0;
for (int i = 1; i <= 6;i += 2){ // 取到等號,若是步進是負的,那麼會取 i >= 6
    a += i;
}

5.2 迭代器形式

迭代器形式輸出一個表時,若是表中有函數,則輸出的順序及個數不肯定(筆者測試得出的結果,具體緣由未知)。

迭代器形式的 for 循環的實質

-- 依次返回 迭代器、狀態表、迭代器初始值
function mypairs(t)

    function iterator(t,i)
        i = i + 1
        i = t[i] and i      -- 若是 t[i] == nil 則 i = nil;不然 i = i
        return i,t[i]
    end

    return iterator,t,0

end

-- 一個表
t = {[1]="1",[2]="2"}

-- 迭代形式 for 語句的 等價形式
do
local f, s, var = mypairs(t)
    while true do
        local var1, var2 = f(s, var)
        var = var1
        if var == nil then break end

        -- for 循環中添加的語句
        print(var1,var2)

    end
end

-- 迭代形式 for 語句
for var1,var2 in mypairs(t) do
    print(var1,var2)
end

--> 1   1
--> 2   2
--> 1   1
--> 2   2

5.2.1 數組形式

ary = {[1]=1,[2]=2,[5]=5}
for i,v in ipairs(ary) do
    print(v)                    --> 1 2
end

從1開始,直到數值型下標結束或者值爲 nil 時結束。

5.2.2 表遍歷

table = {[1]=1,[2]=2,[5]=5}
for k,v in pairs(table) do
    print(v)                    --> 1 2 5
end

遍歷整個表的鍵值對。

關於迭代器的更多內容,可參考Lua 迭代器和泛型 for


參考連接

Lua迭代器和泛型for(介紹 Lua 迭代器的詳細原理以及使用)

相關文章
相關標籤/搜索