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

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

我的目标是从main中创建一个player,我调查了一些关于如何实现这个目标的方法。

链接到Lua教程

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

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())

我期望在控制台打印出结果。但是错误显示'stack traceback中的本地Player无法索引(布尔值)'在main.lua中

点赞
用户7396148
用户7396148

你没有在 player.lua 中返回你的 player 类库。所以当你调用

local Player = require("scripts.player")

时,你将会用 true 覆盖在 player.lua 中创建的全局变量 Player

关于 Require 的参考:https://www.lua.org/manual/5.3/manual.html#6.3


你有两个选择来解决这个问题。

第一种选择)修改 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

或者 第二种选择)修改 main.lua

require("scripts.player")

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

第一种选择遵循更现代化的 Lua 模块约定,但任何一种选择都将解决你的问题。

2020-01-12 23:25:08
用户4567755
用户4567755

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

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.lua 的末尾添加一个返回语句:

Player = {}

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

return Player

如果您想要,您还可以使 Player 本地。这是不必要的,但可能是理想的。

或者 您可以从 main.lua 中删除赋值:

require("scripts.player")
local player = Player.new()
2020-01-13 10:03:23