2009-09-02 5 views
3

Je me demandais s'il y avait un moyen de faire un fichier lua une seule fois et que toutes les tentatives suivantes pour faire ce fichier lua se traduirait par un non-op.Ne fichier qu'une seule fois dans Lua

J'ai déjà pensé à faire quelque chose qui ressemble à l'astuce # if/else/endif de l'en-tête C++. Je me demande s'il existe une façon standard de mettre en œuvre cela.

James

+0

Que voulez-vous dire par "faire un fichier lua"? –

+0

J'utilise dofile() pour le moment à partir de plusieurs endroits sur 1 fichier. – jameszhao00

+0

je préfère toujours 'require' avant' dofile', sauf que vous voulez explicitement * faire le fichier entier sur chaque appel * – nonchip

Répondre

11

bien, require fait à peu près cela.

require "file" -- runs "file.lua" 
require "file" -- does not run the "file" again 
+0

Merci génial. J'ai continué à penser que j'avais besoin d'une définition de module pour les fichiers lua aussi pour une raison quelconque. – jameszhao00

+2

Si le fichier lancé par 'require' ne crée pas de table de module ou ne renvoie pas quelque chose,' require' stocke 'true' dans' package.loaded'. Sinon, il stocke la valeur renvoyée en exécutant le fichier. La fonction 'module' interagit avec ce puits. Tout cela est expliqué dans PiL, mais la copie en ligne n'est pas aussi bonne que l'édition imprimée sur ces détails. – RBerteig

2

Le seul problème avec require est qu'il fonctionne sur les noms de modules, pas sur les noms de fichiers. En particulier, require ne gère pas les noms avec des chemins (bien qu'il utilise package.path et package.cpath pour localiser les modules dans le système de fichiers).

Si vous voulez gérer les noms avec des chemins, vous pouvez écrire un wrapper simple à dofile comme suit:

do 
    local cache={} 
    local olddofile=dofile 
    function dofile(x) 
    if cache[x]==nil then 
     olddofile(x) 
     cache[x]=true 
    end 
    end 
end 
+0

La solution de THC4k ci-dessus fonctionne aussi sur des fichiers. Si un fichier s'appelle abc.lua, require ('abc') fonctionne. – jameszhao00

+1

Oui, mais pas si vous faites un fichier "/home/lhf/scripts/abc.lua". – lhf

+0

en fait, vous pouvez également utiliser 'require '/path/to/file.lua" ' – nonchip

0

basé sur la réponse de lhf, mais en utilisant package, vous pouvez également faire une fois:

package.preload["something"]=dofile "/path/to/your/file.lua" 

puis utilisez:

local x=require "something" 

pour obtenir à nouveau le paquet pré-chargé. mais c'est un peu abusif ...

Questions connexes