2010-03-19 13 views
13

Me pregunto cómo usar funciones de otra secuencia de comandos en Lua. Por ejemplo, digamos GameObjectUtilities tiene funciones que usarán muchas escrituras GameObject. La secuencia de comandos Slime (a GameObject) desea usar una función en GameObjectUtilities.Lua - Cómo usar funciones de otra secuencia de comandos

Tengo problemas para hacer que esto funcione. Miré here, pero todavía no entiendo del todo. ¿Necesito crear un módulo o una tabla para mantener las funciones en GameObjectUtilities para que las funciones que contiene se utilicen en otras secuencias de comandos? Si es así, ¿cuál es la mejor manera de hacerlo?

Es muy extraño. De hecho, funciona cuando lo hago de la manera normal. El problema es que cuando ejecuto mi aplicación e intenta usar el script, no funciona. No lo entiendo

+1

¿Has mirado en package.path - http://www.lua.org/manual/5.1/manual.html#pdf-package.path? Además, ¿estás seguro de que no obtienes ningún error de Lua, quizás de alguna manera los estés ignorando? – sbk

Respuesta

12

No, no tiene que crear un módulo. Si usted acaba de crear foo.lua así:

function double(n) 
    return n * 2 
end 

Y luego, en la secuencia de comandos, require 'foo', usted será capaz de acceder a la función double al igual que se definió en el mismo guión. Esas funciones no pueden obtenerse en sus locales, pero se crean en el mismo entorno; todo module 'name' hace es crear una nueva tabla y restablecer el entorno actual a esa tabla.

lo tanto, sólo puede hacer:

function slimefunc(...) stuff() end 

En GameObjectUtils.lua, y si require 'GameObjectUtils', entonces Slime sólo puede utilizar slimefunc. O, si se quiere que sea un espacio de nombres:

utils = {} 

function utils.slimefunc(...) stuff() end 

y será accesible como utils.slimefunc. (Si lo hace, tendrá que ser muy cuidadoso al no permitir que sus nombres se filtren; haga un uso juicioso de los locales.)

+0

Esto no funciona.No puede encontrar el archivo por alguna razón. – Person

+0

Bueno, en realidad me di cuenta de que estaba usando una sintaxis diferente, como require (""); Cambié a la tuya y encontré la ruta de archivo correcta pero aún no pude encontrar el archivo. Lamentablemente, esto requiere que se vea en los lugares incorrectos para los otros archivos. Voy a publicar un ejemplo. – Person

+0

Mi "requerir sintaxis" es solo una abreviatura de llamadas a funciones. Si llama a una función con solo un literal de cadena o un literal de tabla (aunque no una variable que lo contenga), puede reemplazar 'function ('')' o 'function ({})' con 'function ''' y 'function {}', dejando fuera el paréntesis. No debería hacer una diferencia de ninguna manera, ya que requerir es solo una función normal. ¿Estás seguro de que tu configuración 'package.path' es correcta? – LeafStorm

1

No nos ha dado suficiente información. Por ejemplo, no dice si se define GameObjectUtilities o cuál es su valor. (Supongo que se establece en true.)

le recomiendo que compre el second edition del excelente libro Programación de Roberto Ierusalimschy en Lua, lo que explica el uso idiomático de require y module muy sencilla y clara. También es un libro excelente para cualquiera que use Lua para sacar el máximo provecho del idioma y las bibliotecas. Como la suerte lo tiene, hay un free sample chapter que en este momento cubre exactamente el tema que está buscando. Pero compre el libro de todos modos; que es de $ 25 bien gastado :-)

Si no desea comprar el libro, se puede leer la free sample chapter, y también se puede leer sobre how to do things the "old" way, without module(...), debido a que el entire previous edition es gratis en Internet.

Una posible respuesta corta es que la secuencia de comandos "utilidades" debe probablemente crear una tabla y devolverlo.

Cuestiones relacionadas