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

调用自身函数时出现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,提问作者Илья Бизунов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:45:48