调试 – 这是lua中的错误,还是我不知道的功能?

我正在尝试教我的一个朋友,基本上,他是用这个代码来找我的,它让我很难过:

a = {name = "aaa"}

function a:new()
  self.x = "sss"
  o = {}
  setMetatable(o,self)
  self.__index = self
  return o
end

function a:some()
  return "[ " .. self.name .. " ]"
end

b = a:new()
print(b:some())
print(b.x)

打印

[aaa]
SSS

两者都不可能,因为它们从来没有被设置为:new

经过一些调试,我调查一下,这里发生了一些有趣的事情:

a = {name = "aaa",x = "sss"}

function a:new()
  o = {}
  print(o.x,self.x)
   -- nil sss
  setMetatable(o,self)
  print(o.x,self.x,o,self,self.__index,o.__index)
   -- nil sss table: 0x1001280 table: 0x1001320 table: 0x1001320 nil
  self.__index = self
  print(o.x,o.__index)
   -- sss sss table: 0x1001280 table: 0x1001320 table: 0x1001320 table: 0x1001320
  return o
end

注意第三次打印时,它返回self的.x值,但它是从o调用的,它与self没有“关系”,这怎么可能?

解决方法

您已在Metatable中将表a设置为__index字段,用于将使用:new()创建的所有表.当在b表中检查一些不存在的字段时,也将搜索值.这就是为什么你可以在表b中找到字段x或名称,即使你没有明确指定它.

相关文章

1.github代码实践源代码是lua脚本语言,下载th之后运行thmai...
此文为搬运帖,原帖地址https://www.cnblogs.com/zwywilliam/...
Rime输入法通过定义lua文件,可以实现获取当前时间日期的功能...
localfunctiongenerate_action(params)localscale_action=cc...
2022年1月11日13:57:45 官方:https://opm.openresty.org/官...
在Lua中的table(表),就像c#中的HashMap(哈希表),key和...