上一回,我有了好的 Lua 開發工具,可以研究 CC: Tweaked 的程式碼
今天,我重新以 CC: Tweaked Computer 開機相關的程式碼,來學習 Lua 語言特性
開機顯示 Message Of The Day 的程式碼如下
motd.lua
local date = os.date("*t")
if date.month == 1 and date.day == 1 then
print("Happy new year!")
elseif date.month == 12 and date.day == 24 then
print("Merry X-mas!")
elseif date.month == 10 and date.day == 31 then
print("OOoooOOOoooo! Spooky!")
else
local tMotd = {}
for sPath in string.gmatch(settings.get("motd.path"), "[^:]+") do
if fs.exists(sPath) then
for sLine in io.lines(sPath) do
table.insert(tMotd, sLine)
end
end
end
if #tMotd == 0 then
print("missingno")
else
print(tMotd[math.random(1, #tMotd)])
end
end
首先看到 local
關鍵字,為何要特別宣告 local 呢?
因為 Lua 變數宣告預設是全域範圍,參考範例:
function showTitle()
title = 'ironman'
end
showTitle()
print(title)
上述程式碼會印出 ironman,即使 title 變數是在 function 內部宣告,在 function 外部仍然可見
用 local 定義變數範圍是區域後,可避免變數污染的問題
如果 title 的宣告加上 local
,則最後只會輸出 nil
接著可以發現,Lua 的變數宣告是沒有型別的
事實上,Lua 變數是弱型別,其型別由值決定
以下給出 Lua 的 7 種型別,並用 type()
顯示其真正型別
var = nil
print(type(var)) -- nil,變數預設值,變數未經宣告直接取值也是 nil
var = true
print(type(var)) -- boolean
var = 30
print(type(var)) -- number
var = 'ironman'
print(type(var)) -- string,可以用單引號說雙引號
var = function (n) return n*2 end
print(type(var)) -- function
var = coroutine.create(function() print("Hello, ironman") end)
print(type(var)) -- thread
var = {}
print(type(var)) -- table
還有第 8 種型別是 userdata,據了解是和其他語言互動用的
我自己還未熟悉
你可以用 tostring()
, tonumber()
來將字串、數字轉型
var = tostring(2021)
print(type(var))
var = tonumber('2021')
print(type(var))
或是用運算子自動轉型
使用 + 會自動轉型成 number
使用 .. 會自動轉型成 string
以下都是輸出 2021
var = 20 .. 21
print(var)
var = 2020 + '1'
print(var)
以下是分別在麥塊電腦上,以及本機的 Lua 互動介面測試
可以看到,Lua 指令其實可以寫在同一行
當然這通常不是一個好的風格
以上是關於 Lua 變數的分享
下次我仍會圍繞在同一段 Code,持續的帶大家了解 Lua 語言特性~