陳述句
賦值
- 修改一個變數或者修改 table 中的一個欄位的值
- 多重賦值,lua 先對等號右邊的所有元素進行求值,然后再賦值
- 值的個數小于變數的個數,那么多余的變數就置為 nil
- 初始化變數,應該為每一個變數賦一個初始值
- 收集函式的多個回傳值
x,y = y,x --變數交換
a[i], a[j] = a[j], a[i]
-- 值的個數小于變數的個數
x, y, z = 1, 5 -- z = nil
x, y = 1, 5, 8 -- x = 1, y = 5
區域變數與塊
- local 創建區域變數
- 區域變數作用域僅限于宣告他們的塊
- 一個塊就是一個控制結構的執行體,或函式的執行體,或程式塊
x = 10
local i = 1
while i < x do
local x = i * 2
print(x) -- 2, 4, 6 ...
i = i + 1
end
print(x) -- 10
if i > 20 then
local x
x = 20
print(x + 2) -- 22
else
print(x) -- 10
end
print(x) -- 10
互動模式將每一行理解為一個程式塊,并立即執行,可能結果會不同
顯式的界定一個塊
do
-- code block
end
盡量使用區域變數
- 訪問區域變數要快于全域變數
- 避免污染全域環境
- 區域變數通常會隨這其作用域的失效而消失,便于垃圾收集器釋放
- lua 將區域變數的宣告當作陳述句處理,可在任何允許輸入陳述句的情況下,輸入區域變數的宣告
- 所宣告的區域變數的作用域從宣告陳述句開始直至所在塊的結束
- 宣告可包含初始化賦值
- 多重賦值時,額外的值會被丟棄,額外的變數置為 nil
- 沒有被賦值的會被置為 nil
-- 習慣寫法
local foo = foo -- 全域變數 foo 的值賦給區域變數 foo, 用來保存全域變數的值
控制結構
- if, elseif, for, while 顯式的終止符為 end
- repeat 顯式的終止符為 until
- 控制結構中的條件運算式可以是任何值
if
if 條件運算式 then else end
if a < 0 then
a = 0
end
if a < b then
return a
else
return b
end
-- lua 不支持 switch
if op == "+" then
r = a + b
elseif op == "-" then
r = a - b
elseif op == "*" then
r = a * b
elseif op == "/" then
r = a / b
else
error("invalid operation")
end
while
- 測驗 while 條件,如果為假,回圈就結束
- 否則就執行回圈體并重復這一程序
local i = 1
while a[i] do
print(a[i])
i = i + 1
end
repeat...until
- 一直執行回圈體,直到條件為真時結束
repeat
line = io.read()
until line ~= ""
- 在 lua 中一個宣告
- 在回圈體中區域變數的作用域包含了條件測驗
-- 這在 lua 中是可以執行的
local sqr = x / 2
repeat
sqr = (sqr + x / sqr) / 2
local error = math.abs(sqr ^ 2 - x)
until error < x / 10000
數值型 for
- 變數 var 從 exp1 變化到 exp2 ,每次變化以 exp3 為步長(遞增并執行一次執行體)
- exp 是可選的,默認為 1
for var = exp1, exp2, exp3 do
-- 執行體
end
for i = 10, 1, -1 do
print(i) -- 10, 9, 8,...
end
for 的細節
- 回圈的三個運算式是在回圈開始前一次性求值的
- 控制變數會被自動的宣告為 for 陳述句的區域變數,并在回圈體內可見
- 控制變數在回圈結束后就不存在了
- 如果需要在回圈結束后訪問控制變數,必須將控制變數的值保存在另一個變數中
- 不要在回圈程序中修改控制變數的值
- 可使用 break 陳述句在 for 正常結束前提前結束它
泛型 for
- 通過迭代器函式遍歷所有的值
- ipairs() 用來遍歷陣列
- 在每次回圈中 i 都會被賦予一個新的索引值,v 會被賦予一個對應于該索引的元素值
for i,v in ipairs(a) do
print(v)
end
-- 列印 table 中的 key 值
for k, in pairs(t) do
print(k)
end
二種 for 型別的共同點
- 回圈變數都是回圈體的區域變數
- 不應該對回圈變數進行賦值
days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}
-- 將名稱轉換成它在一周中的位置,索引為字串,值為對應的位置,方便查找,逆向 table
revDays = {["Sunday"] = 1, ["Monday"] = 2 ,["Tuesday"] = 3, ["Wednesday"] = 4, ["Thursday"] = 5, ["Friday"] = 6, ["Saturday"] = 7}
x = "Tuesday"
print(revDays[x]) -- 3 列印 Tuesday 的位置
revDays = {}
for k,v in pairs(days) do
revDays[v] = k
end
break 與 return
- 都用于跳出當前塊
- break 用于結束一個回圈,只會跳出包含它的內層回圈,而不會跳出外層回圈
- 執行 break 后,會在跳出的外層回圈中繼續執行
- return 用于函式回傳結果或簡單的結束函式的執行
- 任何函式的結尾處實際上都有一句隱式的 return
- 如果函式沒有值需要回傳的話,需要在其結尾處添加 return 陳述句
- break 和 return 只能是一個塊的最后一條陳述句(應該是程式塊的最后一條陳述句如:end, else, until 前的一條陳述句)
- 因為 return 或 break 后的陳述句將無法執行到
local i = 1
while a[i] do
if a[i] == v then
break -- 條件陳述句塊中的最后一條陳述句
end
i = i + 1
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/5308.html
標籤:其他
上一篇:Unreal Engine 4 藍圖完全學習教程(五)—— 關于陣列
下一篇:lua學習之型別與值篇
