基礎 2:流程控制與函式
上一頁認識了變數與印出結果。這一頁學怎麼讓腳本依條件做不同的事、重複做同一件 事很多次,以及怎麼把一段常用的邏輯包成一個可以重複呼叫的函式。
比較與邏輯運算子
上一頁看過 ==(是不是相等)。條件除了「相不相等」,常常還要問「比較大小」,或
「好幾個條件要同時成立」,Lua 用這些符號:
| 運算子 | 意思 |
|---|---|
== | 相等 |
~= | 不相等 |
< | 小於 |
> | 大於 |
<= | 小於等於 |
>= | 大於等於 |
這些運算子兩邊放要比較的值,算出來的結果是上一頁說的布林值(true/
false)。
還有三個字,用來把好幾個布林值合併成一個:
A and B:A跟B都是true,結果才是true。A or B:A、B只要有一個是true,結果就是true。not A:把A反過來,true變false,false變true。
例如 ic.addr() >= 0 and ic.addr() <= 0x7F 的意思是「ic.addr() 大於等於 0,
而且小於等於 0x7F」——兩個條件都要成立,結果才是 true。之後跟硬體有關的
頁面會看到這樣的用法。
if:條件判斷
if 條件 then
-- 條件成立時執行這裡
else
-- 條件不成立時執行這裡
endelse 與它底下那一段是可以省略的,省略時「條件不成立」就什麼都不做。條件本身
通常就是上面那張表裡的一個比較,例如 sum > n(sum 比 n 大)。
for:跑固定次數的迴圈
for i = 1, 5 do
-- 這裡會執行 5 次,i 依序是 1, 2, 3, 4, 5
endi 是一個每次迴圈都會自動往前推進的變數,1, 5 代表「從 1 數到 5,含頭含尾」。
while:跑到條件不成立為止
while 條件 do
-- 條件成立就一直重複執行這裡
end跟 for 不同的是,while 不知道會跑幾次——只要條件還成立就繼續,你要自己在迴圈
裡想辦法讓條件終有一天變成不成立(例如每圈把某個變數加 1),不然它會永遠跑下去。
function:把一段邏輯包起來重複用
local function square(x)
return x * x
end這行定義了一個叫 square 的函式:呼叫它時要給一個值(放進括號裡,這裡叫 x),
它會算出 x * x 再用 return 把結果送回去。之後只要寫 square(5),就等於把
x 換成 5 跑一次這段邏輯,拿到結果 25。
delay_ms:先預告一下
範例最後會呼叫一次 delay_ms(1),意思是「暫停 1 毫秒再繼續」——之後專門有一頁
會講清楚它的用途與怎麼中止一支正在等待的腳本,這裡只要知道它會讓腳本停頓一下就好。
範例:把 if/for/while/function 兜起來
-- 流程控制:if/for/while/function/delay_ms。
local function square(x)
return x * x
end
check(square(5) == 25, "square(5) == 25")
local sum = 0
for i = 1, 5 do
sum = sum + i
end
check(sum == 15, "for-loop sum 1..5 == 15")
local n = 0
while n < 3 do
n = n + 1
end
check(n == 3, "while-loop counted to 3")
delay_ms(1)
if sum > n then
log("info", "sum is bigger than n")
else
log("info", "sum is not bigger than n")
endCHECK OK: square(5) == 25
CHECK OK: for-loop sum 1..5 == 15
CHECK OK: while-loop counted to 3
sum is bigger than n自己跑跑看:
nexus_tui.exe --dongle mock --batch --run basics_flow.lua接下來
下一頁介紹 table(可以裝很多個值的變數)、string.format(組出固定格式的
文字),以及 pcall(保護呼叫,讓錯誤不會直接中斷腳本)。