在Lua中你如何导入模块?

时间:2011-08-30 19:44:10

标签: import module lua declaration require

你使用

吗?
require "name"

local name = require "name"

另外,您是否明确将系统模块声明为局部变量? E.g。

local io = require "io"

请解释您的选择。

Lua 2ed编程说“如果她更喜欢为模块使用较短的名称,她可以为它设置一个本地名称”,而local m = require "mod"的任何内容都不比require "mod"快。如果没有区别,我宁愿使用清除require "mod"声明,也不会为预加载的系统模块编写声明。

3 个答案:

答案 0 :(得分:7)

有些图书馆只采用一种方式,有些图书馆只采用另一种方式

{1}}语法是lua 5.1中引入的语法;作为一个笔记;此调用并不总是返回模块;但是预计将使用库的名称创建全局(因此,您现在有一个require "name"来使用该库)。例如,gsl的早期版本 - 如果您_G.name,则本地local draw = require"draw"将包含draw;并遮蔽图书馆创建的全局true

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

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

<强> tldr; 在新代码中,您应该使用后一种local name = require"name"语法;它适用于绝大多数情况,但如果你正在使用一些较旧的模块,他们可能不支持它,你只需要使用local name = require"name"


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

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

之类的linter

(my)首选样式的示例模块;只能使用require"module"语法。

local name = require"name"

答案 1 :(得分:6)

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

答案 2 :(得分:1)

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

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

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

您还必须记住,有几种方法可以编写Lua模块。某些模块不返回其模块表,而其他模块不创建任何全局变量。最常见的解决方案是创建和返回全局,但不能总是依赖于此。