无法理解 Lua 表的继承。

希望有人可以理解我正在尝试解决的问题,只是似乎不太了解 Lua 就能做到这一点。

--[[
    tbl.a.test("moo") returns "Table A moo appears"
    tbl.b.test("moo") returns "moo appears"
]]
tbl = {
    a = { ID = "Table A" },
    b = {
        test = function(...) print(... .. " appears") end,
    },
}
tbl.a__index = function(self, ...) tbl.b[self](tbl.a.ID .. ...) end

我正在尝试的是,我可以创建几个表格 a,c,d,e,并不必将 test 复制到每个表格中。当使用 tbl.a.test,tbl.c.test,tbl.d.test 时,它将检索 tbl.a.ID 变量,然后调用 tbl.b.test(ID,"moo")。

到目前为止,我发现除了 tbl.b 之外,它无法在其他任何内容中找到 .test。

\*\* 编辑 ** 感谢目前为止的支持,代码现在是;

tbl = {
    a = { ID = "Table A " },
    b = { test = function(...) local id, rest = ... print(id .. ": " .. rest)     end },
}
setmetatable(tbl.a, {__index=function(self, k, ...) local rest = ... return     tbl.b[k](tbl.a.ID, rest) end})

但是,由于某种奇怪的原因,... 没有被推进去:|

点赞
用户646619
用户646619
  • 你在 tbl.a__index 之间缺少了一个句点。
  • __index 需要在 a 的元表中,而不是在表本身中。
  • 你的 __index 函数没有返回任何东西。
  • __index 函数中的 self 是被索引的表,而不是键(也就是第二个参数)。

应该这样写:

setmetatable(tbl.a, {__index=function(self, k) return tbl.b[k](tbl.a.ID) end})
2015-05-08 15:59:45
用户3735873
用户3735873

[子]类的创建

Lua中类和对象之间的区别只是理论上的,实际上它们的实现方式完全相同。

每当需要进行继承时,您都可以使用我的通用newclass()函数来创建新的类/对象,或从现有类/对象中继承。

您想要传递的任何公共代码和数据都应放入'prototype'表中(每种情况都可以为其命名)。

此外,在调用方法时,您似乎忘记使用方法调用语法(使用冒号而不是句点)。如果没有它,Self参数将不会被自动识别。

2015-05-08 23:20:36