Почему этот отличный код создает исключение MultipleCompilationErrorsException? - PullRequest
0 голосов
/ 18 февраля 2009

У меня есть следующий заводной код:


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

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

Ответы [ 2 ]

1 голос
/ 18 февраля 2009

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

Я не уверен насчет остальной части вашего кода (поскольку он не будет компилироваться, когда вы его разместили). Но у вас либо действительно старая версия 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 / bar" и "foo / baz".

Если я сохраню его в "walkFiles.groovy" и вызову его из командной строки с

groovy walkFiles.groovy foo

Он печатает:

foo/bar
foo/baz

Это последняя версия groovy:

groovy -v
Groovy Version: 1.6-RC-3 JVM: 1.5.0_16
0 голосов
/ 18 февраля 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...