Lua 模拟c++';使用名称空间';经由环境

Lua 模拟c++';使用名称空间';经由环境,lua,metatable,lua-5.2,meta-method,lua-5.3,Lua,Metatable,Lua 5.2,Meta Method,Lua 5.3,如果我有一个文件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中编写add(),我可以添加以下内容: l

如果我有一个文件
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中编写
add()
,我可以添加以下内容:

local foo = require('foo')
local add, sub, multiply = foo.add, foo.sub, foo.multiply
但是,当您从许多文件中包含许多值的别名时,这就开始成为一个难题。C++中有一个方法:< /p>
#include <iostream>
using namespace std
据我所知,它尊重范围,所以下面的代码很好:

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

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

有什么理由我会后悔这样做吗?(除了同样适用于
使用命名空间的原因以外)

更改全局环境对其他库是不礼貌的

试试另一种方法:

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

<> >注意< C++ >代码>将在<代码> Foo< <代码> > <代码>打印< /COD>原始C++代码> .Env。

使用C++的方式越来越被认为是差的实践。我知道C++中不流行的原因,而我不是。在得到这个线程的响应后,开始把这个放在我的lua代码上。我倾向于避免编写需要高级知识才能理解的代码,因为这会降低代码的可读性,这显然违反了这一规则。我只是好奇。
do
  local _ENV = setmetatable(foo, {index = _ENV})
  print(add(1, 1))
end