加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

lua – 我需要澄清Metatable .__ index

发布时间:2020-12-14 21:47:18 所属栏目:大数据 来源:网络整理
导读:我之前问过为什么我的方法不是由Lua找到我的方法,并且被告知通过将__index设置为我的metatable,它会解决问题,所以我假设一个方法被调用时是通过metatable中的索引进行搜索,但是我遇到了一个问题,因为我需要在myatable上使用索引括号[和],所以__index被指定从
我之前问过为什么我的方法不是由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绑定到,只是为了避免这些问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读