我需要澄清Metatable .__ index

Wee*_*ine 5 lua metatable

我之前问过为什么我的方法不是由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)

Nic*_*las 6

你要明白之间的差别__index__newindex他们与关系,目前主要表的内容.

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

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

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

  • 从主表读取的密钥在主表中尚不存在时.

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

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