如何在 Lua Corona Labs 中使用 OO?无法索引错误

How to use OO in Lua Corona Labs? Unable to index error

我正在使用 Corona SDK 开发游戏并创建了一个带有 main.lua 文件的新项目,但我想添加其他单独的文件,例如 player.lua 以便我可以进行面向对象的操作。

我的目标是从主创建一个播放器,我对如何实现进行了一些研究。
a link to lua tutorial

这是我对这些文件的代码:

player.lua :

Player = {}

Player.new = function(name, id)

    local self = {}
    name = name or "player"
    id = id or 0

    self.getName = function() return name end
    self.getId = function() return id end

    end
return self

main.lua :

local Player = require("scripts.player")

player1 = Player.new("Player1", 1)
print(player1.getName())

我期待在控制台中打印。错误显示 'unable to index local Player (a boolean value) stack traceback' in main.lua

您没有 return player.lua 中的播放器库。所以当你打电话给

local Player = require("scripts.player")

您将在 player.lua 中创建的全局变量 Player 隐藏在 require 的结果 true 中。

References on Require: https://www.lua.org/manual/5.3/manual.html#6.3


您有 2 个选择来更正此问题。

选项 1) 改变 player.lua

local Player = {}

Player.new = function(name, id)

    local self = {}
    name = name or "player"
    id = id or 0

    self.getName = function() return name end
    self.getId = function() return id end

    return self
end

return Player

选项 2) 更改 main.lua

require("scripts.player")

player1 = Player.new("Player1", 1)
print(player1.getName())

选项一遵循更现代的 Lua 模块约定,但任一选项都可以解决您的问题。

第一个问题是构造函数的 return 语句放在了错误的位置。它应该在构造函数内部而不是外部:

Player = {}

Player.new = function(name, id)
    local self = {}
    name = name or "player"
    id = id or 0

    self.getName = function() return name end
    self.getId = function() return id end

    return self
end

始终如一地缩进代码将帮助您立即发现此类问题。我建议始终将 end 缩进到与块开头相同的级别(无论它是 functionfordo 还是其他任何内容)。

解决此问题后,您遇到了 Nifim 提到的问题 - 您需要注意遮蔽 Player。最简单的解决方案是在 player.lua:

的末尾添加一个 return 语句
Player = {}

-- `Player.new` and so on...

return Player

如果需要,您也可以将 Player 设为本地。它不是必需的,但可能是需要的。

您可以从 main.lua:

中删除作业
require("scripts.player")
local player = Player.new()