在Lua函数中使用_ENV无效

问题描述 投票:0回答:1

我正在查看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设置本地环境。我不是要特定的库,我只是想知道为什么它不起作用以及如何修复它。

lua
1个回答
1
投票

M.op(a + b)

此行未达到您的期望,因为它使用了调用此方法时可用的ab值。不必在方法内设置_ENV值,因为到控件到达该位置时,已经检索到ab引用的值,并且在您的方法中这两个值都是nil代码,您可能会收到“尝试对全局执行算术...”错误。

如何解决。

我不确定您要解决的确切问题,因为您已经参考了适用的示例。如果分配complex.a,则无法假设a具有相同的值而不将complex表映射到_ENV

© www.soinside.com 2019 - 2024. All rights reserved.