【问题标题】:Why is this groovy code throwing a MultipleCompilationErrorsException?为什么这个 groovy 代码会引发 MultipleCompilationErrorsException?
【发布时间】:2009-02-17 21:16:51
【问题描述】:

我有以下 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 ,脚本就可以工作。这不应该像现在这样工作吗?

【问题讨论】:

    标签: exception scripting groovy


    【解决方案1】:

    在 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
    

    【讨论】:

      【解决方案2】:

      在脚本模式下(或通过“groovyConsole”),您需要在使用前用“def”声明walker。 Groovy 脚本文件在编译之前被翻译成类 Script 的派生类。所以,每一个声明都需要做好。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-10
        • 2016-02-03
        • 2018-04-05
        • 1970-01-01
        • 1970-01-01
        • 2017-03-28
        • 1970-01-01
        相关资源
        最近更新 更多