iT邦幫忙

2021 iThome 鐵人賽

DAY 5
0
Software Development

在麥塊的農場裡寫 Lua系列 第 5

Day5 「開機」學習 Lua - 變數型別與宣告

上一回,我有了好的 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 指令其實可以寫在同一行
當然這通常不是一個好的風格
Minecraft CC: Tweaked Computer Lua interactive
Lua interactive: type convertion

以上是關於 Lua 變數的分享
下次我仍會圍繞在同一段 Code,持續的帶大家了解 Lua 語言特性~


上一篇
Day4 尋找合適的 Lua 開發工具
下一篇
Day6 開機學習 Lua - 標準函式庫
系列文
在麥塊的農場裡寫 Lua30

尚未有邦友留言

立即登入留言