为什么这段groovy代码会抛出multipleComplationErrorSexception?

为什么这段groovy代码会抛出multipleComplationErrorSexception?,exception,scripting,groovy,Exception,Scripting,Groovy,我有以下groovy代码: 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(arg

我有以下groovy代码:


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())
我注意到,如果我在walker前面放置一个def,脚本就会工作。这不应该像现在这样工作吗?

在脚本模式下(或通过“groovyConsole”),在使用它之前需要一个带有“def”的walker声明。Groovy脚本文件在编译之前会被转换为类脚本的派生类。因此,每一项声明都需要妥善完成

另一方面,当您在“groovysh”(或使用GroovyShell类的实例)中运行脚本时,它的机制会自动绑定每个引用对象,而无需声明

已更新
我上面的回答可能是错误的,因为我反编译了Groovy的.class,发现它在脚本中也使用了绑定对象。因此,我的第一段确实错了。

在groovyConsole或groovy脚本中不需要def。我认为拥有它是一个很好的编程实践,但是语言没有它会工作,并将这些类型的变量添加到脚本绑定。

我不确定您的代码的其余部分(因为它不会像您发布的那样编译)。但是,您可能有一个非常旧的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