【问题标题】:How can I import all symbols from a lua module to the global namespace?如何将所有符号从 lua 模块导入到全局命名空间?
【发布时间】:2020-11-06 00:27:48
【问题描述】:

在 Python 中,我们可以键入 from math import * 来一次导入所有数学函数。

我怎样才能在 Lua 中做类似的事情?我想把mathlove.graphicslove.audio等的所有符号都导入,方便写小实验程序。

我知道这是不受欢迎的。

【问题讨论】:

  • 我的回答是:不要。您只是放弃了使 Lua 要求系统如此出色的封装。
  • 请注意,在 Python 中,每个模块都有自己的全局命名空间,因此将符号从模块导入到全局变量中纯粹是本地决定。在 Lua 中,全局命名空间是 global (除非你明确地给每个脚本自己的环境);每个脚本都共享它。如果您从模块中导入“所有符号”,那么 every 脚本也会获取这些符号。这不是“不赞成”;它以错误的语言使用了错误的工具。

标签: import module lua love2d


【解决方案1】:

在写这个问题时,我想出了一种从模块中导入所有符号的方法:

function use(module, ...)
    for k,v in pairs(module) do
        if _G[k] then
            io.stderr:write("use: skipping duplicate symbol ", k, "\n")
        else
            _G[k] = module[k]
        end
    end
end

示例用法:

require "use"
use(math)
use(love.graphics)

print(sin(pi/6))

function love.draw()
    setColor(1, 0, 0)
    circle("fill", 300, 300, 100)
end

【讨论】:

  • 我建议使用warn,而不是stderr,这样您可以更轻松地打开或关闭它:D(这实际上更像是一个警告而不是实际错误)
  • 如何“导入”函数debug.debug()?
  • @DarkWiiPlayer,我打算使用warn,但它在 Love2D 中对我不起作用,也许他们使用的是较旧的 Lua 或其他东西。
  • @EgorSkriptunoff,use() 函数不会破坏现有符号,但您可以进行特殊情况导入,例如 dbg = debug.debug
猜你喜欢
  • 1970-01-01
  • 2017-12-20
  • 2018-10-31
  • 2017-05-29
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多