如何找到表的元表

是否有测试(或神奇的方法)可以找出您在脚本中遇到的表是否具有在本脚本或其他被要求的模块中的元表?而​​不必搜查整个代码。

点赞
用户4984564
用户4984564

如果你想确定它是否为一个metatable,可以使用以下代码:

if getmetatable(some_table) ~= nil then
  print "It has a metatable"
else
  print "It doesn't have a metatable"
end

即使metatables被设置为__metatable = false,这个代码也可以检测到它们的存在。如果你想尊重这种情况,并将“隐藏”的metatable视为没有metatable,你还需要检查false(或者只需写if getmetatable(some_table) then...

(感谢Egor Skriptunoff指出这一点!)

2018-12-20 14:35:39
用户7396148
用户7396148

如果您想了解元表的内容,请阅读文档或源代码。

通过定义__metatable可以锁定表的元表,在这种情况下,getmetatable 几乎可以返回程序员想要的任何值,但不能设置为nil

Lua-Users Metatable Events

__metatable - 隐藏元表。当调用“getmetatable(myTable)”时,如果myTable的元表有一个__metatable键,则返回该键的值而不是实际元表。

没有保证的方法可以告诉您给定表的元表的内容。

修改:根据Nicol Bolas的陈述,将nil作为值设置无法实现。

2018-12-20 16:32:21