无法弄清楚lua表的继承性

时间:2015-05-08 15:56:09

标签: 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而不必将测试复制到每个表。使用tbl.a.testtbl.c.testtbl.d.test后,它会检索tbl.a.ID var,然后调用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})

然而,由于一些奇怪的原因,......并没有取得进展:|

2 个答案:

答案 0 :(得分:3)

  • 您错过了tbl.a__index之间的句号。
  • __index需要位于a的metatable上,而不是表格本身。
  • 您不会从__index函数
  • 返回任何内容 self函数中的
  • __index是被索引的表,而不是键(这是第二个参数)

这应该有效:

setmetatable(tbl.a, {__index=function(self, k) return tbl.b[k](tbl.a.ID) end})

答案 1 :(得分:1)

--------------------------------------------------------------------------------
-- [Sub]Class creation
--------------------------------------------------------------------------------

function newclass(new_obj,old_obj)
  old_obj = old_obj or {}               --use passed-in object (if any)
  new_obj = new_obj or {}
  assert(type(new_obj) == 'table','New Object/Class is not a table')
  assert(type(old_obj) == 'table','Old Object/Class is not a table')
  old_obj.__index = old_obj             --store __index in parent object (optimization)
  return setmetatable(new_obj,old_obj)  --create 'new_obj' inheriting 'old_obj'
end

--------------------------------------------------------------------------------

prototype = {
  test = function(self,s) print('Table ' .. self.id .. ' ' .. s .. ' appears') end
}

tbl = {}

tbl.a = newclass({id = 'A'},prototype)
tbl.b = newclass({id = 'B'},prototype)

tbl.a:test('moo')
tbl.b:test('moo')

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

任何时候你需要继承,你可以使用我的通用newclass()函数来创建一个新的类/对象,或从现有的继承。

任何常见代码&您希望传递的数据应该进入'原型'表(无论你是否愿意为每个案例调用它)。

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