scala - Scala 和 Groovy 之间的主要区别是什么?

标签 scala groovy

从表面上看,Groovy 和 Scala 看起来非常相似,除了 Scala 是静态类型而 Groovy 是动态类型之外。

  • 彼此相比还有哪些主要差异和优势?
  • 它们到底有多相似?
  • 两者之间存在竞争吗?
    • 如果是这样,您认为从长远来看谁会获胜?

最佳答案

它们都是适用于 JVM 的面向对象语言,具有 lambda 表达式和闭包,并可与 Java 进行互操作。除此之外,它们非常不同。

Groovy 是一种“动态”语言,不仅是因为它是动态类型的,而且还支持动态元编程。

Scala 是一种“静态”语言,因为它是静态类型的,除了 Java 中可以做的尴尬的事情之外,几乎没有动态元编程。请注意,Scala 的静态类型系统比 Java 的静态类型系统更加统一和复杂。

Groovy 在语法上受到 Java 的影响,但在语义上更多地受到 Ruby 等语言的影响。

Scala 在语法上受到 Ruby 和 Java 的影响。它在语义上更多地受到 Java、SML、Haskell 和一种非常晦涩的 OO 语言(称为 gBeta)的影响。

由于 Groovy 处理 Java 重载的方式,它会出现“意外”的多重分派(dispatch)。

Scala 仅支持单调度,但具有受 SML 启发的模式匹配来处理多调度要处理的一些相同类型的问题。然而,多重分派(dispatch)只能分派(dispatch)运行时类型,而 Scala 的模式匹配可以分派(dispatch)运行时类型、值或两者。模式匹配还包括语法上令人愉快的变量绑定(bind)。很难过分强调这个功能本身就让 Scala 编程变得多么令人愉快。

Scala 和 Groovy 都支持使用 mixin 的多重继承形式(尽管 Scala 称它们为特征)。

Scala 在语言级别支持部分函数应用和柯里化(Currying),Groovy 有一种笨拙的“柯里化(Currying)”方法来进行部分函数应用。

Scala 进行直接尾递归优化。我不相信 Groovy 会这么做。这在函数式编程中很重要,但在命令式编程中不太重要。

默认情况下,Scala 和 Groovy 都会进行急切评估。但是,Scala 支持按名称调用参数。 Groovy 没有 - 按名称调用必须用闭包来模拟。

Scala 有“for 推导式”,这是其他语言中的列表推导式的概括(从技术上讲,它们是 monad 推导式加上一点 - 介于 Haskell 的 do 和 C# 的 LINQ 之间)。

Scala 没有“静态”字段、内部类、方法等概念 - 它使用单例对象。 Groovy 使用静态概念。

Scala 没有像 Groovy 那样内置算术运算符选择。在 Scala 中,您可以非常灵活地命名方法。

Groovy 有 elvis 运算符来处理 null。 Scala 程序员更喜欢使用 Option 类型而不是使用 null,但如果您愿意,在 Scala 中编写 elvis 运算符很容易。

最后,还有谎言,该死的谎言,然后是基准。计算机语言基准测试游戏将 Scala 评为比 Groovy 快很多(快两倍到 93 倍),同时保持大致相同的源代码大小。 benchmarks

我确信还有很多很多差异我没有提及。但希望这能给您一个要点。

他们之间有竞争吗?是的,当然,但没有你想象的那么多。 Groovy 的真正竞争对手是 JRuby 和 Jython。

谁会赢?我的 Crystal 球和其他人的一样破裂了。

关于scala - Scala 和 Groovy 之间的主要区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/711913/

相关文章:

Scala 在可变函数中下划线星号?

Scala 宏 : Getting a List of TypeSymbols to be used at runtime

groovy - 为什么这个简单的 Groovy 脚本在 Jenkins 管道中失败了?

groovy - 从groovy中的href-tag中提取URL

shell - Groovy:如何在 groovy 中执行复杂的 shell 命令?

java - 在 IntelliJ 中清理 Play 框架构建

scala - Spark 使用相同的键创建字段数组

scala - 如何获得Seq的第n个元素?

grails - Groovy Grails-存储对象以供后续请求

eclipse - 有没有一种简单的方法可以将 griffon 功能添加到 groovy 中?