通过 _ENV 模拟 C++ 'using namespace'
Emulating c++ 'using namespace' via _ENV
如果我有文件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()
所困扰并且更愿意在 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
将在foo
和print
中解析为原始_ENV
。
如果我有文件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()
所困扰并且更愿意在 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
将在foo
和print
中解析为原始_ENV
。