繁体   English   中英

通过_ENV模拟C ++“使用命名空间”

[英]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.lua输入foo.add() ,而宁愿在bar.lua只写add() ,也可以添加以下代码:

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解析,并在原始_ENV print

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM