为什么这段groovy代码会抛出multipleComplationErrorSexception?
我有以下groovy代码:为什么这段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
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