我之前问过为什么我的方法不是由Lua找到我的方法,并且被告知通过设置__index我的metatable,它会解决问题,所以我假设一个方法被调用时是通过metatable中的索引进行搜索,但我已经遇到了一个问题,现在我需要使用索引括号[和]我的元表,因此__index被分配到从它里面的一张桌子返回索引,我该如何解决您在使用这两种方法的功能需求和使用索引括号
我写了一个指示问题的最小例子:
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()
Run Code Online (Sandbox Code Playgroud)
你要明白之间的差别__index和__newindex他们与关系,目前主要表的内容.
__newindex 仅在满足以下所有条件时才调用/访问:
tbl[index] = expr(或等效语法tbl.name = expr).第二个经常骚扰人们.这就是你的问题,因为只有在以下__index情况下才能访问:
因此,如果要过滤每个读取和写入表,那么该表必须始终为空.因此,这些读取和写入需要进入您为每个新对象创建的其他表.因此,您的new函数需要创建两个表:一个保持为空,另一个表中包含所有数据.
老实说,我希望Lua有办法创建一个空的userdata,你可以将用户定义的metatable绑定到,只是为了避免这些问题.