【问题标题】:Lua: Problems with "local var = require("my lib") [duplicate]Lua:“local var = require(“my lib”)的问题[重复]
【发布时间】:2012-09-21 03:09:27
【问题描述】:

可能重复:
Why make global Lua functions local?

在社区的许多 lua 脚本中,我看到类似向脚本中添加模块:

local module = require("module")

但是根据lua-manual,这不是加载模块的方式。模块本身有它们的模块名称,所以

require("module")

足以像这样使用模块:module.myfunction()。第一个具有本地定义的示例只是将“true”写入模块变量 - 表示模块已成功加载。

奇怪的是,我在网络上到处都能看到这种加载“local module = require("module")”的情况。由于这个错误,来自 lua-community 的大多数脚本我都无法正常工作。我也想知道为什么我还没有在网上发现任何关于此的问题。

接下来的事情是,实际上加载模块有时也会导致奇怪的错误。例如:我有一个带有

的脚本
require("purexml.lua")

比我得到这个错误:

no field package.preload['purexml.lua']
no file './purexml/lua.lua'
no file '/usr/local/share/lua/5.1/purexml/lua.lua'
no file '/usr/local/share/lua/5.1/purexml/lua/init.lua'
no file '/usr/local/lib/lua/5.1/purexml/lua.lua'
no file '/usr/local/lib/lua/5.1/purexml/lua/init.lua'
no file './purexml/lua.so'
no file '/usr/local/lib/lua/5.1/purexml/lua.so'
no file '/usr/local/lib/lua/5.1/loadall.so'
no file './purexml.so'
no file '/usr/local/lib/lua/5.1/purexml.so'
no file '/usr/local/lib/lua/5.1/loadall.so'

但是这样做效果很好:

require("purexml")

我在这里遗漏了一些非常明显的东西吗?顺便说一句,我用的是 Lua 5.1.4...

【问题讨论】:

  • @Nicol 不是同一个问题。特别是因为 Lua 5.2 现在需要在本地引用该模块。
  • @prapin:不,它没有。 5.2 和 5.1 一样,对模块的功能没有任何特殊要求。如果你想在一个模块的全局表中粘贴东西,你可以。这不是建议,但你可以做到。事实上,虽然 module 函数已被弃用,但它仍然存在并且可以使用。
  • 老实说......为什么这个问题被关闭了?这与指示的问题不重复...
  • 凹凸。生病跳上桩。请有人对此进行审核并删除标题中的重复项,“可能重复”标题等...要求/模块是完全不同的问题。
  • 好的,我尝试通过编辑来取消复制,但被“为白天小队获取我的积分”拒绝。我当然是带着世间所有的爱这样说的。 :)

标签: module lua require


【解决方案1】:

在 Lua 5.2 中,表现良好的模块不再像在 Lua 5.1 中那样导出全局变量。

除了 local 变量提供的速度提升之外,使用local module = require "module"用于与最新的 Lua 版本兼容。

【讨论】:

    【解决方案2】:

    local module = require("module") 创建一个包含模块的 local 变量,以及默认的 global (当然,局部遮蔽全局)。在 Lua 中,Locals 的访问速度要快得多,因此性能很可能是使用它的原因。

    而且你得到的错误很明显,你不能在加载模块时添加文件扩展名。

    【讨论】:

    • 但不知何故没有。我只得到一个从 require("module") 返回的布尔变量。示例:local xml = require("purexml") print (xml) -> true 然后当我尝试时: xml:collect() 控制台说:尝试索引本地'xml'(布尔值)(仍然使用 Lua 5.1 .4)
    • 啊,我想我现在明白了!了解 module(..., package.seeall) 或替代方法,即 local M = {} - 模块文件中的公共接口,最后返回 M。仔细阅读此文件有帮助:lua-users.org/wiki/ModuleDefinition
    • 这与性能无关。使用局部变量而不是在全局空间中设置东西是一种结构化代码的方式,因此它可以减少“惊喜”。不幸的是,并不是所有的 lua 库都遵循这个约定。
    猜你喜欢
    • 1970-01-01
    • 2011-03-21
    • 2017-08-28
    • 2021-10-23
    • 2019-07-17
    • 1970-01-01
    • 2020-05-31
    • 2011-10-01
    • 1970-01-01
    相关资源
    最近更新 更多