在 Lua 中如何导入模块?

Posted

技术标签:

【中文标题】在 Lua 中如何导入模块?【英文标题】:In Lua how do you import modules? 【发布时间】:2011-11-07 02:41:21 【问题描述】:

你用过

require "name"

local name = require "name"

另外,您是否将系统模块显式声明为局部变量?例如

local io = require "io"

请解释您的选择。

Lua 2ed 中的编程说“如果她更喜欢为模块使用更短的名称,她可以为其设置一个本地名称”,而 local m = require "mod"require "mod" 快没有任何意义。如果没有区别,我宁愿使用更干净的require "mod" 声明,也不会费心为预加载的系统模块编写声明。

【问题讨论】:

【参考方案1】:

它们中的任何一个都有效。将其存储在本地不会改变模块可能已注册全局函数的事实。

【讨论】:

但是将其存储在本地是否会给您带来有意义的速度优势? @Vitaly:速度优势是否有意义取决于您在做什么。您每帧调用这些函数的频率如何?有问题的代码甚至是瓶颈吗? 我实际上没有在 enterFrame 事件中做任何事情,而是使用 Corona SDK 的计时器和转换 API,所以在我的情况下可能没有性能优势。感谢您澄清这一点。【参考方案2】:

有些库只以一种方式工作,而有些则只以另一种方式工作

require "name" 语法是在 lua 5.1 中引入的;作为注释;此调用并不总是返回模块;但预计将使用库的名称创建一个全局(因此,您现在有一个 _G.name 来使用该库)。例如,早期版本的 gsl——如果你做了local draw = require"draw",本地的draw 将包含true;并隐藏库创建的全局draw

module 函数鼓励上述行为 ==> 现在相对不推荐使用,任何编写良好的新代码都不会使用它。

local name = require"name" 语法最近成为首选(大约 2008 年?);当决定为您设置任何全局变量的模块是一件坏事时。 作为一点:我所有的库都没有设置全局变量,只返回一个函数表;或者在其他一些情况下,它们返回一个作为根对象初始化器的函数。

tldr; 在新代码中,您应该使用后者local name = require"name" 语法;它适用于绝大多数情况,但如果您使用的是一些较旧的模块,它们可能不支持它,您只能使用require"module"


回答您添加的问题你需要系统模块吗?:没有;您只是假设它们已经是必需的;但我确实本地化了我使用的所有函数(通常按它们来自的模块分组为行),包括来自外部库的函数。这使您可以轻松查看代码实际依赖的函数;以及从您的字节码中删除所有 GETGLOBAL。

编辑:现在不鼓励本地化功能。要查找意外的全局变量,请使用类似 luacheck

的 linter

(我的)首选风格的示例模块;仅适用于 local name = require"name" 语法。

local my_lib = require"my_lib"

local function foo()
    print("foo")
end

local function bar()
    print("bar", my_lib.new())
end

return 
    foo = foo;
    bar = bar;

【讨论】:

那么您是否建议使用此处提出的替代方案:lua-users.org/wiki/LuaModuleFunctionCritiqued 我建议编码模块,例如:local print,tblconcat = print,table.concat; local function foo () return tblconcat(1,2,3) end; local function bar(...) print("bar",...) end; return foo = foo; bar = bar 【参考方案3】:

我会说这主要归结为您喜欢什么,但根据您所写的内容,也有一些例外。创建本地引用会加快速度,但在大多数情况下,这并不是一个有意义的优化。您还应该将本地指向您正在使用的函数,而不是模块表。

如果您正在编写库,那么我建议为您使用的所有全局变量创建本地引用。即使您没有使用 module() 函数,它也会更改后面代码的全局范围。这样做的原因是它阻止您的库调用在加载库后已更改的全局变量。

执行local io = require’io’ 将确保您从package.loaded.io 获取表,即使_G.io 已被另一个表替换。我自己一般不会这样做。我希望 io 在我编写 Lua 时已经被加载且未修改。

您还必须记住,编写 Lua 模块有多种方法。一些模块不返回它们的模块表,而另一些不创建任何全局变量。最常见的解决方案是创建和返回一个全局变量,但您不能总是依赖它。

【讨论】:

以上是关于在 Lua 中如何导入模块?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取由python模块导入的模块列表

如何在 PyCharm 中创建模块并将其导入?

在 Python 中,如何从导入的模块访问主模块的命名空间?

python如何导入自定义模块

如何找出从哪个模块导入名称?

如何在python3中正确导入同一目录下的模块