Lua中使用模块的一些基础知识
Lua通过模块实现代码封装与复用:模块文件返回一个表,其中局部函数对外不可见。require加载模块并缓存结果,多次调用仅执行一次;dofile每次重新执行;loadfile只加载不运行;loadstring将字符串编译为函数并执行,可动态运行代码。
在 Lua 中,模块的使用是组织代码的核心手段。先来看一个典型的模块文件 mod.lua:
local M = {}
local function sayMyName()
print('Hrunkner')
end
function M.sayHello()
print('Why hello there')
sayMyName()
end
return M
这个模块定义了一个局部函数 sayMyName,并通过表 M 暴露了 sayHello 方法。注意,局部函数对外是不可见的——这是 Lua 模块封装的关键机制。
那么,另一个文件如何引用这个模块呢?用 require:
local mod = require('mod') -- 运行文件mod.lua.
-- require是包含模块的标准做法。
-- require等价于: (针对没有被缓存的情况;参加后面的内容)
local mod = (function ()
end)()
-- mod.lua就好像一个函数体,所以mod.lua的局部变量对外是不可见的。
require 会把整个模块文件当作一个函数体执行,并返回模块中的 M。所以,从外面只能调用 mod.sayHello(),而无法直接访问 mod.sayMyName():
mod.sayHello() -- Says hello to Hrunkner.
mod.sayMyName() -- 错误
这里有一个容易忽略的细节:require 是有缓存机制的。同一个模块只会被执行一次,即使你多次 require 它。举个例子:
-- 即使它被require了多次。
-- 假设mod2.lua包含代码"print('Hi!')"。
local a = require('mod2') -- 打印Hi!
local b = require('mod2') -- 不再打印; a=b.
-- dofile与require类似,只是不做缓存:
dofile('mod2') --> Hi!
dofile('mod2') --> Hi! (再次运行,与require不同)
如果你需要每次都重新执行模块文件,可以用 dofile。而 loadfile 则只加载不执行,返回一个函数,等你需要时再调用:
f = loadfile('mod2') -- Calling f() runs mod2.lua.
对于字符串形式的代码,则可以用 loadstring,它相当于针对字符串的 loadfile:
g = loadstring('print(343)') --返回一个函数。
g() -- 打印343; 在此之前什么也不打印。

以上就是 Lua 模块使用中最基础、也最实用的几个概念。理解清楚 require 的缓存机制、局部变量的作用域、以及 dofile/loadfile/loadstring 的区别,日常写代码基本就够用了。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















