防止Lua表中的函数覆盖。

我的程序中,当为同一张表定义了相同名称的两个函数时,我希望我的程序会出现一个错误。现在的情况是,它只是调用最后一个函数并执行它。

这是一个示例代码

Class{'Cat'}

function Cat:meow( )
  print("Meow!")
end

function Cat:meow()
  print("Mmm")
end

kitty = Cat:create()
kitty:meow()

执行的结果只是"Mmm"。相反,我希望会出现类似错误信息。

点赞
用户3574628
用户3574628

很遗憾, __newindex 无法拦截对已存在字段的赋值。因此,唯一的方法是保持 Cat 为空,并将其所有内容存储在代理表中。

我不知道你的 OOP 库的性质,所以你必须自行集成此示例:

local Cat_mt = {}

-- 在闭包中隐藏代理表。
do
  local proxy = {}

  function Cat_mt:__index(key)
    return proxy[key]
  end

  function Cat_mt:__newindex(key, value)
    if proxy[key] ~= nil then
      error("Don't change that!")
    end
    proxy[key] = value
  end
end

Cat = setmetatable({}, Cat_mt)
2014-05-22 20:22:46