2010-03-19 8 views
13

Je me demande comment utiliser les fonctions d'un autre script dans Lua. Par exemple, disons GameObjectUtilities contient des fonctions que de nombreux scripts GameObject utiliseront. Le script Slime (GameObject) souhaite utiliser une fonction dans GameObjectUtilities.Lua - Comment utiliser les fonctions d'un autre script

J'ai des difficultés à faire fonctionner cela. J'ai regardé here, mais je ne comprends toujours pas vraiment. Ai-je besoin de créer un module ou une table pour contenir les fonctions dans GameObjectUtilities pour que les fonctions qu'il contient puissent être utilisées dans d'autres scripts? Si oui, quelle est la meilleure façon de s'y prendre?

C'est très étrange. Ça marche vraiment quand je le fais normalement. Le problème est que lorsque j'utilise mon application et qu'elle essaie d'utiliser le script, cela ne fonctionne pas. Je ne comprends pas.

+1

Avez-vous regardé package.path - http://www.lua.org/manual/5.1/manual.html#pdf-package.path? Aussi, êtes-vous sûr de ne pas avoir d'erreurs de la part de Lua, peut-être êtes-vous en train de les ignorer? – sbk

Répondre

12

Non, vous n'avez pas besoin de créer un module. Si vous venez de créer foo.lua comme ceci:

function double(n) 
    return n * 2 
end 

Et puis dans votre script, require 'foo', vous serez en mesure d'accéder à la fonction double comme il a été défini dans le même script. Ces fonctions ne peuvent pas atteindre vos locaux, mais elles sont créées dans le même environnement. Tout ce que fait module 'name' est de créer une nouvelle table et de réinitialiser l'environnement actuel à cette table.

Ainsi, vous pouvez juste faire:

function slimefunc(...) stuff() end 

En GameObjectUtils.lua, et si vous require 'GameObjectUtils', alors Slime pouvez simplement utiliser slimefunc. Ou, si vous voulez qu'il soit un espace de noms:

utils = {} 

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

Et il sera accessible utils.slimefunc. (Si vous faites cela, vous devrez faire très attention à ne pas laisser couler vos noms - faites une utilisation judicieuse des locaux.)

+0

Cela ne fonctionne pas.Il ne peut pas trouver le fichier pour une raison quelconque. – Person

+0

Eh bien, en fait, j'ai réalisé que j'utilisais une syntaxe différente, comme require (""); Je suis passé à la vôtre et il a trouvé le bon chemin d'accès mais n'a toujours pas trouvé le fichier. Malheureusement, cette exigence le fait regarder dans les mauvais endroits pour les autres fichiers. Je vais poster un exemple. – Person

+0

Ma "require syntax" est juste un raccourci pour les appels de fonction. Si vous appelez une fonction avec juste un littéral de chaîne ou un littéral de table (mais pas une variable contenant un tel), vous pouvez remplacer 'function ('')' ou 'function ({})' par 'function ''' et 'function {}', en laissant les parenthèses. Cela ne devrait faire aucune différence, puisque require est simplement une fonction normale. Êtes-vous sûr que votre paramètre 'package.path' est correct? – LeafStorm

1

Vous ne nous avez pas donné suffisamment d'informations. Par exemple, vous ne dites pas si GameObjectUtilities est défini ou quelle est sa valeur. (Je devine qu'il est réglé sur true.)

Je recommande fortement que vous achetez le second edition du superbe livre Programmation Roberto Ierusalimschy dans Lua, ce qui explique l'utilisation idiomatiques de require et module très simplement et clairement. C'est aussi un excellent livre pour quiconque utilise Lua pour tirer le meilleur parti de la langue et des bibliothèques. Par chance, il y a un free sample chapter qui couvre exactement le sujet que vous recherchez. Mais achetez le livre quand même; il est de 25 $ bien dépensé :-)

Si vous ne voulez pas acheter le livre, vous pouvez lire le free sample chapter, et vous pouvez également lire how to do things the "old" way, without module(...), parce que le entire previous edition est gratuit en ligne.

Une réponse courte est possible que votre script « utilitaires » devrait probablement créer une table et retourner.

Questions connexes