You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lua创建类实例存入table后属性全部相同,如何实现实例属性独立?

问题原因

你的代码存在两个核心错误导致所有实例属性共用:

  • 在Block:new方法中,你把传入的坐标、颜色参数赋值给了self,调用Block:new()时self指向的是Block这个类原型表本身,每次调用new都会直接修改原型的属性。而所有新建的实例本身没有x/y/color属性,访问时会自动从元表(也就是Block原型)读取值,所以最终所有实例拿到的都是最后一次修改的原型属性值。
  • 新建的block变量没有加local修饰,会泄漏为全局变量,后续new调用会覆盖全局的block值,属于严重语法隐患。

修复方案

修改Block:new方法,将属性赋值给新创建的实例对象而非原型,同时给局部变量加local修饰:

Block = {x = 0, y = 0, color = "red"}

function Block:new (x, y, color)
   -- 加local声明为局部变量,避免全局污染
   local block = {}
   setmetatable(block, self)
   self.__index = self
   -- 将属性赋值给新实例,而非原型self
   block.x = x or self.x
   block.y = y or self.y
   block.color = color or self.color
   return block
end

上述代码中or self.x的作用是如果调用new时没有传对应参数,就自动使用Block原型里的默认值,如果你不需要默认值逻辑,直接写block.x = x即可。

运行验证

修改后原有测试代码无需调整,运行输出结果如下:

1   0   0   red
2   2   0   blue
3   1   1   green

内容的提问来源于stack exchange,提问作者Matt Mohandiss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 15:36:04