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
相关产品推荐
相关产品推荐

