调用自身函数时出现Bug?Lua代码love.graphics.print报错咨询
问题分析与修复方案
我一眼就看出了问题所在——你在Editor:draw()方法里调用实例函数时,用错了调用对象!
核心问题
Lua里用:调用方法时,会自动把调用者作为self参数传入。你现在在draw里写的是:
Editor:drawValues(w, h)
这会导致drawValues里的self指向的是全局的Editor表(类本身),而不是你实际创建的Editor实例!而全局Editor的interpreter初始值是nil,所以当你尝试访问self.interpreter.grid.cell[x][y]时,自然会因为nil无法访问属性而报错。
反观你在draw里能正常拿到self.interpreter.grid.width,是因为draw方法本身是通过实例调用的(比如editor:draw()),这里的self是正确的实例对象,所以interpreter是有效的。
快速修复
只需要把draw里的方法调用改成用当前实例self来调用就行:
function Editor:draw() local w = self.interpreter.grid.width local h = self.interpreter.grid.height self:drawGrid(w, h) -- 替换Editor:为self: self:drawValues(w, h) -- 这里同样替换 -- 后续代码省略 end
额外注意点
另外还有个潜在小问题:你的循环是从0开始的,但Lua的表默认是1基索引。如果你的grid.cell是按1基创建的(比如cell[1][1]是第一个单元格),那访问cell[0][y]会返回nil,可能导致打印空内容或者其他异常。如果是这种情况,需要调整循环和坐标计算:
function Editor:drawValues(w, h) for x = 1, w do for y = 1, h do -- 因为索引从1开始,坐标要减去一个CELL_SIZE的偏移 local _x = self.x + (x - 1) * CELL_SIZE local _y = self.y + (y - 1) * CELL_SIZE love.graphics.print(self.interpreter.grid.cell[x][y], _x, _y) end end end
小建议
在Lua写面向对象代码时,尽量始终用self来调用实例方法,除非你明确要写静态方法(不需要依赖实例状态的方法)。这样能避免混淆类和实例的状态,减少这类低级错误~
内容的提问来源于stack exchange,提问作者Илья Бизунов
相关产品推荐
相关产品推荐

