如何在 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
缩进到与块开头相同的级别(无论它是 function
、for
、do
还是其他任何内容)。
解决此问题后,您遇到了 Nifim 提到的问题 - 您需要注意遮蔽 Player
。最简单的解决方案是在 player.lua:
的末尾添加一个 return 语句
Player = {}
-- `Player.new` and so on...
return Player
如果需要,您也可以将 Player
设为本地。它不是必需的,但可能是需要的。
或 您可以从 main.lua:
中删除作业
require("scripts.player")
local player = Player.new()
我正在使用 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
缩进到与块开头相同的级别(无论它是 function
、for
、do
还是其他任何内容)。
解决此问题后,您遇到了 Nifim 提到的问题 - 您需要注意遮蔽 Player
。最简单的解决方案是在 player.lua:
Player = {}
-- `Player.new` and so on...
return Player
如果需要,您也可以将 Player
设为本地。它不是必需的,但可能是需要的。
或 您可以从 main.lua:
中删除作业require("scripts.player")
local player = Player.new()