2009-02-17 6 views
0

J'ai le code groovy suivant:Pourquoi ce code groovy lance-t-il une MultipleCompilationErrorsException?


class FileWalker { 
    private String dir 

    public static void onEachFile(String dir,IAction ia) { 
     new File(dir).eachFileRecurse { 
      ia.perform(it) 
     } 
    } 
} 

walker = new FileWalker() 
walker.onEachFile(args[0],new PrintAction()) 

je remarquai que si je place une def devant Walker, le script fonctionne. Est-ce que ça ne devrait pas fonctionner comme ça maintenant?

Répondre

1

Vous n'avez pas besoin de def dans groovyConsole ou dans un script groovy. Je considère que c'est une bonne pratique de programmation de l'avoir, mais le langage fonctionnera sans cela et ajoutera ces types de variables à la liaison des scripts.

Je ne suis pas sûr du reste de votre code (car il ne sera pas compilé comme vous l'avez posté). Mais vous avez soit une version très ancienne de groovy ou autre chose qui ne va pas avec votre config ou le reste de votre code.

Avec l'ajout d'un bout de l'interface IAction manquante et classe PrintAction, je suis en mesure de le faire fonctionner sans modification:

interface IAction { 
    def perform(obj) 
} 

class PrintAction implements IAction{ 
    def perform(obj) { 
     println obj 
    } 
} 
class FileWalker { 
    private String dir 

    public static void onEachFile(String dir,IAction ia) { 
     new File(dir).eachFileRecurse { 
      ia.perform(it) 
     } 
    } 
} 

walker = new FileWalker() 
walker.onEachFile(args[0],new PrintAction()) 

J'ai créé un répertoire fictif avec « foo/bar » et Fichiers "foo/baz".

Si je l'enregistre à "walkFiles.groovy" et l'appeler à partir de la ligne de commande avec

groovy walkFiles.groovy foo 

Il imprime:

foo/bar 
foo/baz 

Ceci est la dernière version de groovy:

groovy -v 
Groovy Version: 1.6-RC-3 JVM: 1.5.0_16 
0

En mode script (ou via "groovyConsole"), vous avez besoin d'une déclaration de walker avec "def" avant de l'utiliser. Un fichier de script Groovy est traduit dans une classe dérivée de la classe Script avant d'être compilé. Donc, chaque déclaration doit être faite correctement. D'autre part, lorsque vous exécutez un script dans "groovysh" (ou en utilisant une instance de la classe GroovyShell), son mécanisme lie automatiquement chaque objet de référence sans avoir besoin de déclaration.

mis à jour: Ma réponse ci-dessus serait une erreur que je décompilé un .class de Groovy et a constaté que cela l'aide d'un objet de liaison dans le script ainsi. Ainsi, mon premier paragraphe était en effet erroné.