【问题标题】:Why does my lua 'class' report an attempt to index global object error?为什么我的 lua 'class' 报告尝试索引全局对象错误?
【发布时间】:2012-08-23 01:54:24
【问题描述】:

以下代码在名为 object.lua 的文件中:

function object:new()
  local instance = {}
  setmetatable(instance, self)
  self.__index = self
  return instance
end

在我的主文件中:

local object = require("object")
local obj = object:new()

报告的错误是: lua ./object.lua:1: 尝试索引全局“object”(一个 nil 值)

第 1 行是带有 'function object:new()' 的第一行

在 main 中,它是第一行(需要)。

代码创建自: http://www.lua.org/pil/16.1.html

编辑:

请看这个页面: http://www.coronalabs.com/blog/2011/09/29/tutorial-modular-classes-in-corona/

然后搜索“james”,这将是第一个评论帖子,你可以看到我在做什么。

【问题讨论】:

  • 你为什么不能把它放在这个帖子里?我们不应该仅仅为了看看您真正想要什么而查看其他网站。
  • 抱歉,当时我认为这不会有问题。

标签: lua


【解决方案1】:

这对我有用:

main.lua

require("object")
local obj = object:new()

object.lua

object = {}

function object:new()
    local instance = {}
    setmetatable(instance, self)
    self.__index = self
    return instance
end

你在object.lua中声明了一个全局“对象”,而不是返回它,所以你只需要require("object")

【讨论】:

  • 您还必须返回object。而且您不应该在模块中将其设为全局。
  • 完美,非常感谢。来自 OOP 背景的 Lua 有点让人头疼。
  • @NicolBolas 你能提供一个代码示例吗?这似乎不违背课堂的要点吗?我知道如何以不同的方式实例化一个类,但建议使用这种方式以避免创建全局声明。
【解决方案2】:

这里的问题是,当 object.lua 中的代码运行并且您尝试创建 object:new 函数时,没有可以在其中创建它的对象表。

Dogbert 的解决方案在 object.lua 使用它之前创建对象表中工作正常。但是,它通过显式创建一个全局变量然后期望调用者发现这不是最佳解决方案来做到这一点。 Nicol Bolas 提供的修改后的解决方案……在 object.lua 中创建一个本地对象并返回它是此类任务更普遍认可的模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-21
    • 2019-08-21
    • 2021-08-04
    • 2014-01-26
    • 2019-03-01
    • 2020-11-03
    • 2015-10-27
    • 2017-12-20
    相关资源
    最近更新 更多