我不理解这里的语法

我在 Roblox Devforum 上遇到了一篇关于 metatable 的帖子,在代理表部分,我不理解以下代码的语法

local function TrackDownTable()
  local t = {x = 5}
  local proxy = setmetatable({}, {
  __index = function(_, key)
      print("User indexed table with "..key)
      return t[key]
  end,
  __newindex = function(_, key, value)
   print("User made or update the field "..key.." with the value "..value.." in table")
   t[key] = value
  end
  })
  return proxy

end

local t = TrackDownTable()
t.x = 5
print(t.x)

在这部分

local t = TrackDownTable()
t.x = 5

local t = TrackdownTable() 是什么意思?以及这部分代码 t.x = 5 如何访问 proxy 表?

点赞
用户2858170
用户2858170

这是一个非常简单的代理演示表格。

代理表是控制表格访问的表格。您可以使用它来跟踪表格访问或实现只读表格等。

没有办法在不经过代理表格的情况下访问或修改该表格的数据。

实际上非常简单。TrackDownTable创建了 t,这只是一些演示表格。我们只需要一个简单的表格来演示表格访问。因此,我们创建了一个包含一个字段的最小表格{x=5}

local proxy = setmetatable({}, {
  __index = function(_, key)
      print("User indexed table with "..key)
      return t[key]
  end,
  __newindex = function(_, key, value)
   print("User made or update the field "..key.." with the value "..value.." in table")
   t[key] = value
  end
  })

可重写为:

local metatable = {}
metatable.__index =  function(_, key)
      print("User indexed table with "..key)
      return t[key]
  end

metatable.__newindex = function(_, key, value)
   print("User made or update the field "..key.." with the value "..value.." in table")
   t[key] = value
  end

local proxy = {}

setmetatable(proxy, metatable)

此代码只是创建了一个具有__index__newindex元方法的元表,并将其设置为我们演示表格的元表。

当您索引代理的字段时,将调用__index

当您将值分配给代理中的索引时,将调用__newindex

编辑:

想知道的是,当t.x = 5 经过t = TrackDownTable()传递给代理表时,它会将其作为“ local t = TrackDownTable()`` ”的参数传递吗?

t.x = 5是一个索引分配。如果您执行此操作,Lua将检查t中是否有键为“x”的字段。在此范围内,t [“x”]为nil,它将检查是否有元表。有,因此它将调用我们的__newindex元方法,该方法具有3个参数(表格,键,值)

因此,我们实际上调用了getmetatable(t).__index(t,“x”,5),它内部将将值分配给TrackDownTable中定义的本地t.x

在这个例子中,两个表格都命名为t有点误导性。

请阅读 https://www.lua.org/manual/5.4/manual.html#2.4

2021-06-01 06:54:27