第四課 語句

賦值、控制和過程調用

賦值
Lua允許“多重賦值”,也就是一下子將多個值賦予多個變量。每個值或每個變量之間以逗號隔開。
a, b = 10, 2 * x
在多重賦值中,Lua先對等號右邊的所有元素求值,然後才執行賦值。這樣便可以用一句多重賦值來交換兩個變量了。
x, y = y, x --交換x與y
a[i], a[j] = a[j], a[i] --交換a[i]與a[j]

Lua總是會將等號右邊的值的個數調整到與左邊的變量個數相一致。規則是:
若值的個數少於變量的個數,那麼多餘的變量會被賦值爲nil;如果值的個數多餘變量的個數,那麼多餘的值會被“靜悄悄”地丟棄掉。

局部變量與塊
通過local語句來創建局部變量,變量如果沒有local說明,則默認是全局變量。
j = 1; --全局變量
local i = 0; --局部變量
局部變量的作用域僅限於聲明它們的那個塊。一個塊(block)是一個控制結構的執行體,或者是一個函數的執行體再或者是一個程序塊(chunk)。
在交互模式下,將語句塊放入do end關鍵字之間可以形成一個語句塊,這樣do end之間的語句就不會在輸入後立即被執行。
使用do end可以更嚴格的控制局部變量的作用域
local a = 2
do
local a2 = 2 * a;
local d = 23;
end --a2,d的作用域至此結束
print(a2, d) -->nil nil

儘可能地使用局部變量是一種良好的編程習慣。

Lua將局部變量的聲明當做語句來處理。因此可以在任何可以書寫語句的地方書寫局部變量的聲明。所聲明的局部變量的作用域從聲明語句開始,直至所在塊結尾。聲明語句中還可以包含初始化賦值。如果一條聲明語句沒有初始化賦值,則默認初始化爲nil。
Lua中的一種習慣用法:
local foo = foo --創建一個局部變量foo並用全局變量foo的值初始化它。

控制結構
if while repeat for
所有控制結構都有一個顯示的終止符:if for while以end結尾,repeat以until結尾。
Lua不支持switch語句,所以一連串的if-elseif代碼是很常見的。
repeat
line = io.read()
until line ~= ""
print(line)
與其他大多數語言不同的是,在Lua中,一個聲明在循環體中的局部變量的作用域包括了條件測試。
local sqr = 11
ret = 0
repeat
local x = sqr * 2
sqr = sqr + 1
ret = x
until x > 1000
print(ret)

數字型for
for語句有兩種形式:數字型for和泛型for
數字型for的語法如下:
for var = begin, end [, step] do
<執行體>
end
step不存在的話,默認步長是1
如果不想給循環設置上限的話,可以使用常量math.huge:
for i = 1, math.huge do
if (3 * i ^ 3 >= 1000) then
print(i)
break
end
end
for的3個表達式是在循環開始前一次性求值的。如果包含函數,則只會執行一次。控制變量會被自動地聲明爲for的局部變量,並且僅在循環體中可見。如果需要在循環體外訪問控制變量的值(通常在break循環時),則需要將控制變量賦值給另一個變量中。
local found = nil
for i = 1, #a do
if a[i] < 0 then
found = i
break
end
end
print(found)
不要在循環過程中更改控制變量的值,否則會導致不可預知的效果。如果想在循環正常結束前終止循環,需要使用break語句。

泛型for
泛型for通過一個迭代器(iterator)函數來遍歷所有值:
for i, v in ipairs(a) do print(v) end --打印數組a的所有值
Lua的基礎庫提供了ipairs,這是一個用於遍歷數組的迭代器函數。在每次循環中,i會被賦予一個索引值,同時v被賦予一個對應於該索引的數組元素值。
for k in pairs(t) do print(k) end --打印table t中的所有的key
常見的幾種迭代器:
io.lines 迭代文件中的每行
pairs 迭代table中的元素
ipairs 迭代數組中元素
string.gmatch 迭代字符串中的單詞
用戶還可以自己編寫迭代器。

泛型for和數字型for有兩個相同點:1、循環變量是循環體的局部變量;2、決不應該對循環變量進行任何的賦值

break與return
break和return語句用於跳出當前的塊。
任何函數的結尾處都有一句 隱式的return。所以如果一個函數沒有值需要返回,那麼就無需在其結尾處添加return語句。
由於語法構造的原因,break或return只能是一個塊中的最後一條語句。程序塊的最後一條語句,或者是end else 或until前的一條語句。如果希望在一個塊中間插入break或return,則需要使用do塊來包裹住。
function foo()
return --語法錯誤
do
return --ok
end
print("Hello World!")
end










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