当前位置 : 主页 > 网络编程 > lua >

lua – 我需要澄清Metatable .__ index

来源:互联网 收集:自由互联 发布时间:2021-06-23
我之前问过为什么我的方法不是由Lua找到我的方法,并且被告知通过将__index设置为我的metatable,它会解决问题,所以我假设一个方法被调用时是通过metatable中的索引进行搜索,但是我遇到了
我之前问过为什么我的方法不是由Lua找到我的方法,并且被告知通过将__index设置为我的metatable,它会解决问题,所以我假设一个方法被调用时是通过metatable中的索引进行搜索,但是我遇到了一个问题,因为我需要在myatable上使用索引括号[和],所以__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()
您需要了解__index和__newindex之间的区别,以及它们与主表当前内容的关系.

只有满足以下所有条件时才会调用/访问__newindex:

>当您在主表中设置值时,通过tbl [index] = expr(或等效语法,如tbl.name = expr).
>当您尝试设置到主表中的键在主表中不存在时.

第二个经常骚扰人们.这就是你的问题,因为只有在以下情况下才能访问__index:

>从主表中读取的键在主表中尚不存在时.

因此,如果要过滤每个读取和写入表,那么该表必须始终为空.因此,这些读取和写入需要进入您为每个新对象创建的其他表.因此,您的新函数需要创建两个表:一个保持为空,另一个表中包含所有数据.

老实说,我希望Lua有办法创建一个空的userdata,你可以将用户定义的metatable绑定到,只是为了避免这些问题.

网友评论