¿Por qué mi 'clase' lua informa un intento de indexar un error de objeto global?
Frecuentes
Visto 5,196 veces
1
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.
2 Respuestas
1
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
1
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 lua or haz tu propia pregunta.
¿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. - Nicol Bolas
Disculpas, en ese momento no pensé que sería un problema. - TigerCoding