gpt4 book ai didi

lua - 我需要澄清 Metatable.__index

转载 作者:行者123 更新时间:2023-12-04 18:09:31 25 4
gpt4 key购买 nike

我之前问过为什么 Lua 没有找到我的元表方法,并通过设置 __index 被告知。到我的元表,它会解决这个问题,所以我假设一个方法在调用时是通过元表中的索引搜索的,但是我现在遇到了一个问题,我需要使用索引括号 []在我的元表上,所以 __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仅在以下情况下访问:
  • 当从主表中读取的键在主表中不存在时。

  • 因此,如果您想过滤对表的每次读取和写入,则该表必须始终为空。因此,这些读取和写入需要进入您为每个新对象创建的其他表。所以你的 new函数需要创建两个表:一个是空的,另一个是其中的所有数据。

    老实说,我希望 Lua 有一种方法来创建一个空的用户数据,您可以将一个用户定义的元表绑定(bind)到它,以避免这些问题。

    关于lua - 我需要澄清 Metatable.__index,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18026132/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com