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 语言特性~


<<:  反思与第二部序章

>>:  提款、存款、汇款一次到位

## 第二十九课:自由练习

前言 就如同标题所讲的,今天就来自由练习吧。那今天我练习的主要会是在骨架的部分。对,过了这麽久依旧在...

[Day 30] 完赛心得:你的前端之旅还尚未结束

未完待续的前端之旅 在这30天我们带到了前端技能树上各种类型的技能,包括基本的 HTML、CSS、J...

调节磁碟和CPU的矛盾 - InnoDB的Buffer Pool

快取的重要性 我们知道不论是聚簇索引或是二级索引,资料都是储存在表格空间,而表格空间其实只是个抽象概...

#20 数据中的机率性(1)

tags: tags: 2021IT 了解随机性 从整体上观察矩阵(集合)中的物件分布与矩阵整体的关...

[Day1] 30天大纲

第一次参加铁人赛,感谢杨适豪的邀请 先来设定30天的大纲吧 前言 目标定义 - 我的动作游戏是什麽?...