我正在查看Lua的一些玩具示例,在那边我发现了以下有关环境的示例:
M = {} -- the module
complex = {} -- global complex numbers registry
mt = {} --metatable for complex numbers
function new (r, i)
local cp = {}
cp = {r=r, i=i}
return setmetatable(cp,mt)
end
M.new = new -- add 'new' to the module
function M.op (...)
--Why does not it work?
local _ENV = complex
return ...
end
function M.add (c1, c2)
return new(c1.r + c2.r, c1.i + c2.i)
end
function M.tostring (c)
return string.format("(%g,%g)", c.r, c.i) --to avoid +-
end
mt.__tostring = M.tostring
mt.__add = M.add
complex.a = M.new(4,3)
complex.b = N.new(6,2)
--nil
M.op(a+b)
--It works
M,op(complex.a+complex.b)
_ENV
的使用无效。但是,如果我使用complex = _G
,则两行均有效。如何为M.op
设置本地环境。我不是要特定的库,我只是想知道为什么它不起作用以及如何修复它。
M.op(a + b)
此行未达到您的期望,因为它使用了调用此方法时可用的a
和b
值。不必在方法内设置_ENV
值,因为到控件到达该位置时,已经检索到a
和b
引用的值,并且在您的方法中这两个值都是nil
代码,您可能会收到“尝试对全局执行算术...”错误。
如何解决。
我不确定您要解决的确切问题,因为您已经参考了适用的示例。如果分配complex.a
,则无法假设a
具有相同的值而不将complex
表映射到_ENV
。