2009-02-17 2 views
0

У меня есть следующий код: заводнойПочему этот код groovy бросает исключение 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()) 

Я заметил, что если я помещаю четкости перед ходунками, скрипт работает. Разве это не так, как сейчас?

ответ

1

Вам не нужна определенная функция в groovyConsole или в оригинальном скрипте. Я считаю, что это хорошая практика программирования, но язык будет работать без него и добавит эти типы переменных в привязку скриптов.

Я не уверен в остальной части вашего кода (поскольку он не будет компилироваться, как вы его разместили). Но у вас либо есть действительно старая версия groovy, либо что-то еще не так с вашей конфигурацией или остальной частью вашего кода.

С добавлением заглушки для отсутствующего интерфейса IAction и класса PrintAction, я могу заставить его работать без изменений:

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()) 

я создал фиктивный каталог с «Foo/бар» и «foo/baz».

Если я сохранить его в «walkFiles.groovy» и вызывать его из командной строки с

groovy walkFiles.groovy foo 

Он печатает:

foo/bar 
foo/baz 

Это с последней версией заводной:

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

В режиме написания сценариев (или через «groovyConsole») перед использованием вам требуется объявление ходока с «def». Файл сценария Groovy преобразуется в производный класс класса Script перед его компиляцией. Таким образом, каждое заявление должно быть сделано правильно.

С другой стороны, когда вы запускаете скрипт в «groovysh» (или используя экземпляр класса GroovyShell), его механизм автоматически связывает каждый объект ссылки без необходимости объявления.

обновленный: Мой ответ выше был бы неправильно, как я декомпилирован в .class из Groovy и обнаружил, что он использует объект привязки внутри сценария, а также. Таким образом, мой первый абзац был действительно неправильным.

Смежные вопросы