lua中import和require的区别

2025-05-21 22:08:11
推荐回答(1个)
回答1:

载入一个模块
import()

require()
功能相同,但具有一定程度的自动化特性。
假设有如下的目录结构:
app/
app/classes/
app/classes/MyClass.luaapp/classes/MyClassBase.luaapp/classes/data/Data1.luaapp/classes/data/Data2.lua
MyClass
中需要载入
MyClassBase

MyClassData。如果用
require(),MyClass
内的代码如下:
local
MyClassBase
=
require("app.classes.MyClassBase")
local
MyClass
=
class("MyClass",
MyClassBase)
local
Data1
=
require("app.classes.data.Data1")
local
Data2
=
require("app.classes.data.Data2")
假如将
MyClass
及其相关文件换一个目录存放,那么就必须修改
MyClass
中的
require()
命令,否则将找不到模块文件。
而使用
import(),只需要如下写:
local
MyClassBase
=
import(".MyClassBase")
local
MyClass
=
class("MyClass",
MyClassBase)
local
Data1
=
import(".data.Data1")
local
Data2
=
import(".data.Data2")
当在模块名前面有一个"."
时,import()
会从当前模块所在目录中查找其他模块。因此
MyClass
及其相关文件不管存放到什么目录里,都不再需要修改
MyClass
中的
import()
命令。这在开发一些重复使用的功能组件时,会非常方便。
可以在模块名前添加多个"."
,这样
import()
会从更上层的目录开始查找模块。
不过
import()
只有在模块级别调用(也就是没有将
import()
写在任何函数中)时,才能够自动得到当前模块名。如果需要在函数中调用
import(),那么就需要指定当前模块名:
#
MyClass.lua
#
这里的
...
是隐藏参数,包含了当前模块的名字,所以最好将这行代码写在模块的第一行
local
CURRENT_MODULE_NAME
=
...
local
function
testLoad()
local
MyClassBase
=
import(".MyClassBase",
CURRENT_MODULE_NAME)
#
更多代码
end
Parameters
string
moduleName
要载入的模块的名字
[string
currentModuleName]
当前模块名
Returns
module