【问题标题】:Is all Groovy code valid with Groovy++?所有 Groovy 代码都对 Groovy++ 有效吗?
【发布时间】:2011-09-06 09:52:41
【问题描述】:

看到this link后,想试试Groovy++,但是有点担心;

Groovy 的所有语法在 Groovy++ 中都有效吗?

例如,我可以在 Groovy 中执行此操作:

def list = [1,2]

以上代码在 Groovy++ 中有效吗?

【问题讨论】:

    标签: groovy groovy++


    【解决方案1】:

    目标(我相信)是让它支持尽可能多的 Groovy 代码。

    我认为目前有一些领域无法正常工作,包括:

    1. Multiple assignment - doesn't compile
    2. spread-dot operator 可能会导致问题in some situations
    3. .with {} doesn't work

    但是你总是可以解决这些问题,或者不要将需要它们的类标记为@Typed

    【讨论】:

    • 如果您将整个包标记为@Typed,您可以通过将单个类或方法标记为@Typed(TypePolicy.DYNAMIC) 来选择退出
    【解决方案2】:

    http://groovy.dzone.com/articles/groovycomparetogroovy-part-1 处有与代码示例的差异列表

    一些区别:

    • 更严格的编译时检查
    • 不使用 ExpandoMetaClass 即时修改类型
    • 闭包不能更改闭包代码之外的变量
    • 不能直接访问私有方法

    【讨论】:

      【解决方案3】:

      应该是因为在 Groovy++ 中你可以:

      • 轻松混合静态和动态类型代码

      参考:http://code.google.com/p/groovypptest/wiki/Welcome

      【讨论】:

        【解决方案4】:

        a) 别担心。 groovy 和 groovy++ 都不是性能问题。使用这两种语言,您主要编写胶合逻辑。连接各种java库的代码。这些库是用 java 编写的 - 所以它们可以全速运行。

        有时您注意到您已经用 groovy 编写了一大段代码,并且想要增加一些额外的速度。没问题。 Groovy 非常适合对您的算法进行原型设计。由于 Groovy 具有类似 java 的语法并使用所有这些 java 库,因此将您的原型转换为全速运行的 java 库是没有问题的(是的,您必须手动编写代码,但这意味着,您只需'必须从你的 groovy 代码中删除所有这些快捷方式才能将其转换为 java)。

        b) 据我了解 groovy++,它通过注释工作。仅当您注释代码时,它才会被识别为 groovy++ 代码。所以它应该工作。但是正如您从所有这些答案中看到的那样,目前使用 groovy++ 的人并不多,因为性能不是问题(参见 :-)。

        顺便说一句:我猜 groovy++ fork 很快就会被合并到标准的 groovy 主干中......

        【讨论】:

        • 是的。也许是因为我将它用于正确的事情。我不想用 groovy 编写光线追踪器,但我可以想象用 groovy 或它的某些部分为其编写原型。但是当我编写一个 grails 应用程序时(这就是我主要使用 groovy 的目的),性能真的没问题。
        • @ralf。仍然有人说 Grails 非常慢,我们无法控制 Grails 中的每一件事。意味着 Grails 做事更快,但我们不能深入?是真的吗!
        • 有那些谈话,但我还没有遇到这些问题 :-) 买一辆卡车并抱怨它没有保时捷那么快。如果您真的需要速度,您可以随时回退到 java。深度:我使用 php 和其他技术进行了 10 多年的 Web 开发,并在几年前切换到 grails。我没有一刻无法控制某事或无法深入。这就是 grails 的优点:它使日常任务变得非常简单,并且仍然可以让您深入了解。
        【解决方案5】:

        @Typed(TypePolicy.MIXED) 让想要使用 groovy++ 优化代码的开发人员的生活变得更加轻松。但是它并不完全支持 groovy 代码。

        即使使用 @Typed(TypePolicy.MIXED) 的 groovy++ 代码兼容性仍然存在问题

        例如groovy 风格类型转换(使用关键字“as”)

         String foo = myUntypedFoo as String
        

        需要改成

         String foo = (String)myUntypedFoo
        

        在闭包之外声明的变量也不能直接在这些闭包中使用:

          @Typed(TypePolicy.MIXED)
          def countMatches( List<String> bahList, String pattern ){
            int counter = 0
            bahList.each{ String bah ->
              if (bah==pattern) counter++
            }
          }
        

        需要改成java风格(违背了groovy++的目的)或者你必须使用引用对象。

        groovy++ 对提高 groovy/grails 性能非常有用,但它肯定不是一个简单的方法,我不确定是否应该改用 java。

        【讨论】:

          【解决方案6】:

          Groovy++ 引入了@Typed(TypePolicy.MIXED) 注解,完全兼容Groovy。

          使用@Typed(TypePolicy.DYNAMIC) 或根本不使用@Typed,你将失去所有Groovy++ 的优势。

          如果可能,MIXED TypePolicy 会优化静态位置。

          【讨论】:

            猜你喜欢
            • 2010-10-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多