¿Por qué mi 'clase' lua informa un intento de indexar un error de objeto global?

El siguiente código está en un archivo llamado object.lua:

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

En un archivo principal tengo:

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

El error informado es: lua ./object.lua:1: intento de indexar el 'objeto' global (un valor nulo)

La línea #1 es la primera línea con 'objeto de función: nuevo ()'

En main es la primera línea (con require).

Código creado a partir de: http://www.lua.org/pil/16.1.html

Edit:

Por favor vea esta página: http://www.coronalabs.com/blog/2011/09/29/tutorial-modular-classes-in-corona/

Luego busque 'james', será la primera publicación de comentarios y podrá ver lo que estoy tratando de hacer.

preguntado el 28 de agosto de 12 a las 15:08

¿Por qué no puedes simplemente poner eso en esta publicación? No deberíamos tener que buscar en otro sitio web solo para ver lo que realmente está pidiendo. -

Disculpas, en ese momento no pensé que sería un problema. -

2 Respuestas

Esto funciona para mi:

principal.lua

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

objeto.lua

object = {}

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

Está declarando un "objeto" global en object.lua, no devolviéndolo, por lo que solo necesita hacer require("object")

Respondido 28 ago 12, 15:08

También tienes que volver object. Y no deberías hacerlo global en el módulo. - Nicol bolas

Perfecto, muchas gracias. Lua es una especie de dolor de cabeza que viene de un fondo OOP. - TigreCodificación

@NicolBolas ¿Puede proporcionar un ejemplo de código? ¿No parece esto ir en contra del punto de la clase? Sé cómo instanciar una clase de una manera diferente, pero se recomendó esta forma para evitar tener que crear declaraciones globales. - TigreCodificación

El problema aquí es que cuando se ejecuta el código en object.lua e intenta crear la función object:new, no hay una tabla de objetos para crearla.

La solución de Dogbert funciona bien en ese objeto.lua crea la tabla de objetos antes de usarla. Sin embargo, lo hace creando explícitamente un global y luego esperando que las personas que llaman hayan encontrado lo que no es la mejor solución. La solución modificada provista por Nicol Bolas... la de crear un objeto local en object.lua y devolverlo es el patrón generalmente aceptado para este tipo de tarea.

respondido 04 nov., 13:13

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.