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绑定到,只是为了避免这些问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |