使用命名空间'模拟c ++'通过_ENV

时间:2017-11-12 22:13:30

标签: 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()而感到困扰,我宁愿在{{1}中只写add()我可以添加这个:

bar.lua

但是当您从多个文件中包含别名许多值时,这开始变得很痛苦。在c ++中有一种解决方法:

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

在lua中,我认为你可以像这样模仿这个功能:

#include <iostream>
using namespace std

我可以告诉它尊重范围所以像下面的代码一样好玩:

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

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

有什么理由我可能会后悔这样做吗? (除了适用于f = function() -- returns 2 setmetatable(_ENV, {__index = foo}) return add(1, 1) end add(1, 1) -- returns 2 )的原因

1 个答案:

答案 0 :(得分:2)

改变全球环境对其他图书馆来说并不礼貌。

尝试相反的方式:

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

请注意,add将在原始foo的{​​{1}}和print中得到解决。