在Lua中你如何导入模块?

Vit*_*aly 15 import lua module declaration require

你用吗

require "name"
Run Code Online (Sandbox Code Playgroud)

要么

local name = require "name"
Run Code Online (Sandbox Code Playgroud)

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

local io = require "io"
Run Code Online (Sandbox Code Playgroud)

请解释你的选择.

Lua 2ed中的编程说"如果她更喜欢使用较短的名称来代替模块,她可以为它设置一个本地名称",而不是local m = require "mod"更快require "mod".如果没有区别,我宁愿使用清洁require "mod"声明,也不会为预加载的系统模块编写声明.

dau*_*tor 7

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

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;
}
Run Code Online (Sandbox Code Playgroud)


Nic*_*las 6

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