希望有人能够理解我想要弄清楚的东西,只是似乎不能理解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.test
,tbl.c.test
,tbl.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})
然而,由于一些奇怪的原因,......并没有取得进展:|
答案 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()函数来创建一个新的类/对象,或从现有的继承。
任何常见代码&您希望传递的数据应该进入'原型'表(无论你是否愿意为每个案例调用它)。
此外,在调用方法时,您似乎忘记使用方法调用语法(使用冒号而不是点)。没有它,自动参数不会被自动识别。