Skip to Content
Lua 自動化基礎 2:流程控制與函式

基礎 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 -- 條件不成立時執行這裡 end

else 與它底下那一段是可以省略的,省略時「條件不成立」就什麼都不做。條件本身 通常就是上面那張表裡的一個比較,例如 sum > n(sum 比 n 大)。

for:跑固定次數的迴圈

for i = 1, 5 do -- 這裡會執行 5 次,i 依序是 1, 2, 3, 4, 5 end

i 是一個每次迴圈都會自動往前推進的變數,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 兜起來

basics_flow.lua下載 basics_flow.lua
-- 流程控制: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")
end
預期輸出
CHECK 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(保護呼叫,讓錯誤不會直接中斷腳本)。