通过_ENV模拟 C++ 'using namespace'



如果我有一个文件foo.lua

local foo = {}
foo.add = function(a, b) return a+b end
foo.sub = function(a, b) return a-b end
foo.multiply = function(a, b) return a*b end
return foo

bar.lua中,我大量使用foo.lua的代码,我一直在打字foo.add(),并且宁愿只写add() bar.lua我可以添加以下内容:

local foo = require('foo')
local add, sub, multiply = foo.add, foo.sub, foo.multiply

但是,当您包含许多文件中的许多值的别名时,这开始是一种痛苦。在 c++ 中,有一种方法可以解决这个问题:

#include <iostream>
using namespace std

在lua中,我认为您可以像这样模拟此功能:

local foo = require('foo')
setmetatable(_ENV, {__index = foo})

据我所知,它尊重范围,所以下面的代码很好用:

实际上下面的代码不起作用。我正在通过lua repl运行代码。当我在lua文件中编写下面的代码片段时,它没有给出预期的结果。

f = function() -- returns 2
    setmetatable(_ENV, {__index = foo})
    return add(1, 1)
end 
add(1, 1) -- returns 2

我有什么理由后悔这样做吗?(除了也适用于using namespace的原因(

更改全局环境对其他库来说并不礼貌。

尝试相反的方法:

do
  local _ENV = setmetatable(foo, {index = _ENV})
  print(add(1, 1))
end

请注意,add将在原始_ENV中以fooprint解析。

相关内容

最新更新