我有以下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())我注意到,如果我将一个def放在walker前面,脚本就能工作。这不应该是现在的样子吗?
发布于 2009-02-18 03:47:30
您不需要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发布于 2009-02-17 23:30:24
在脚本模式(或通过"groovyConsole")中,在使用它之前,需要使用"def“来声明walker。Groovy脚本文件在编译前被转换为类脚本的派生类。因此,每一项声明都需要正确地进行。
另一方面,当您在"groovysh“(或使用类GroovyShell的实例)中运行脚本时,它的机制会自动绑定每个引用对象,而不需要声明。
更新了:我的上述答案可能是错误的,因为我对Groovy的一个.class进行了反编译,发现它也在脚本中使用绑定对象。因此,我的第一段的确是错的。
https://stackoverflow.com/questions/558755
复制相似问题