Lua函数中使用_ENV没有效果

我正在检查Lua的一些玩具示例,并在其中发现了以下示例,涉及环境:

M = {}         -- 模块
complex = {} -- 全局复数注册表
mt = {} -- 复数的元表
function new (r, i)
   local cp = {}
   cp = {r=r, i=i}
   return setmetatable(cp,mt)
end
M.new = new        -- 将'new'添加到模块
function M.op (...)
    --为什么它不起作用?
    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) --避免+和-
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)
--它可以正常工作
M,op(complex.a+complex.b)

使用_ENV没有效果。但是,如果我使用complex=_G,这两行都可以工作。我如何为M.op设置本地环境。我并不是在寻求特定的库,我只是想知道为什么它不起作用以及如何修复它。

点赞
用户1442917
用户1442917

```

M.op(a+b)

这行代码并不会像你期望的那样运行,因为它使用了调用此方法时可用的ab的值。无论你在方法内设置_ENV的值,因为当控制到达那里时,ab引用的值已经被检索,而你的代码中两个值都是空的,很可能会得到“尝试在全局上执行算术运算…”的错误。

如何修复它。

我不确定你想要修复什么,因为你已经引用了示例,说明它是有效的。如果你对complex.a赋值,那么你就不能假设在没有将complex表映射到_ENV的情况下,a将具有相同的值。

2020-04-20 19:09:08