我之前问过为什么我的方法不是由Lua找到我的方法,并且被告知通过将__index设置为我的metatable,它会解决问题,所以我假设一个方法被调用时是通过metatable中的索引进行搜索,但是我遇到了
我写了一个指示问题的最小例子:
TestMetatable = {DataTable = {}} TestMetatable.__index = TestMetatable function TestMetatable.new() local Tmp = {} setmetatable(Tmp,TestMetatable) Tmp.DataTable = {1} return Tmp end function TestMetatable:TestMethod() print("Ran Successfully") end function TestMetatable.__index(self,index) return self.DataTable[index] end local Test = TestMetatable.new() -- both functionalities are needed print(Test[1]) Test:TestMethod()您需要了解__index和__newindex之间的区别,以及它们与主表当前内容的关系.
只有满足以下所有条件时才会调用/访问__newindex:
>当您在主表中设置值时,通过tbl [index] = expr(或等效语法,如tbl.name = expr).
>当您尝试设置到主表中的键在主表中不存在时.
第二个经常骚扰人们.这就是你的问题,因为只有在以下情况下才能访问__index:
>从主表中读取的键在主表中尚不存在时.
因此,如果要过滤每个读取和写入表,那么该表必须始终为空.因此,这些读取和写入需要进入您为每个新对象创建的其他表.因此,您的新函数需要创建两个表:一个保持为空,另一个表中包含所有数据.
老实说,我希望Lua有办法创建一个空的userdata,你可以将用户定义的metatable绑定到,只是为了避免这些问题.