Day6 开机学习 Lua - 标准函式库

Day6 开机学习 Lua - 标准函式库

上一回分享的是,Lua 变数型别与宣告
今天主题则是 Lua 内建的标准函式库,先看上次相同的程序码:
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

在这里所看到的,os, string, io, table, math 都是内建的标准函式库,此外还有 coroutine, package, utf8, debug
而事实上,我一直使用的 print(), tonumber(), tostring(), type() 则都是属於 Basic 函式库
以下会针对上述用到的函数做简介

日期与时间: os.date(), os.time()

os.date("*t") 是回传一个 table 变数,有 year、month、day 等属性可供操作
如果没有给 *t 参数,预设是回传当前日期时间的字串表示
os.time() 则是回传 timestamp
其他 os function 可参考官方文件

var = os.date("*t")
print(type(var))  -- table
print(var)        -- table: 0x2188870
var = os.date()
print(type(var))  -- string
print(var)        -- Tue Sep 14 04:25:20 2021
var = os.time()
print(type(var))  -- number
print(var)        -- 1631589920

档案逐行读取: io.lines()

io 用来处理档案的存取
io.lines 是读取档案後,回传 iterator 函数,以便可以在回圈中逐一读取每一行资料
其他 function 可参考 Lua io 官方文件

table 变数操作: table.insert()

table.insert 的语法结构是

table.insert(list, [pos,] value)

预设行为是将 value 存入 list 的最後一笔
中间 pos 是 index,但注意从 1 开始,跟其他语言从 0 开始不同,可省略
其他 function 可参考 Lua table 官方文件

数学运算随机数:math.random()

math.random() 则回传 0~1 的随机数,范围是 [0,1)
和其他语言比较不同的是
math.random(5) 等同於 math.random(1, 5),只回传 1, 2, 3, 4, 5 任何一个整数
其他 math function 可参考 Lua math 官方文件

字串处理:string.gmatch()

gmatch() 会以规则运算式来比对字串,并回传 iterator 函数,来取得每次符合的子字串
以下程序码就是将除了冒号以外的字串找出来

string.gmatch(settings.get("motd.path"), "[^:]+")

关於可运用的规则运算式,可参考 Lua regular expression pattern

其他 string function 可参考 Lua string 官方文件

再次研究开机程序

那我有个问题,为什麽是冒号?不是分号、逗号或其它字元呢?
我再次用 motd.path 去搜寻 rom/ 所有程序码
找到 bios.lua 有这麽一段

settings.define("motd.path", {
    default = "/rom/motd.txt:/motd.txt",
    description = [[The path to load random messages from. Should be a colon (":") separated string of file paths.]],
    type = "string",
})

看起来,电脑预设行为是从 /rom/motd.txt/motd.txt 随机找一行来显示开机讯息
你只要先清除之前的 motd.path 环境变数
在麦块电脑底下输入

set motd.path nil

然後编辑 /motd.txt 内容後多次重新开机,就可以印证。

以上是今天的分享,下次我会探索这段 Code 最後一部分
条件判断与回圈控制


<<:  Day.13 Crash Recovery - InnoDB 架构 -> MYSQL 二阶段提交(2PC) _1

>>:  Flutter体验 Day 13-弹性布局

第二十六天:UI切版 & 元件-图文资讯元件、ICON字型 & SVG、通知讯息元件

今天的内容 一、图文资讯元件 二、ICON: Webfont & SVG 三、通知讯息元件 ...

Day 26 - 实战演练 — Notifier 、Notification

想先看 Code 或是 Demo 的由此去 Github Repo: ithelp-ui-demo...

C# 入门之正则表达式匹配并替换

好久没有更新了,最近比较忙,不过今天遇到一个很有意思的问题,就过来记录一下。 通过正则表达式匹配文本...

(Day15) 闭包进阶使用,工厂模式及私有方法。

上回介绍闭包概念以及闭包大致运用,这次则介绍实做比较常用闭包的几种模式 工厂模式 上个章节有介绍到,...

【从实作学习ASP.NET Core】Day07 | 後台 | 复杂的商品模型

前面花了点时间介绍了 MVC,今天终於要进入正题啦! 我会以一个电玩专卖店的购物网站为主题,并且从後...