【问题标题】:Difference between using App trait and main method in scala在scala中使用App trait和main方法的区别
【发布时间】:2012-07-26 10:46:26
【问题描述】:

有什么区别

object Application extends App {
   println("Hello World")
}

object Application {
    def main(args: Array[String]): Unit = {
        println("Hello World");
    }
}

【问题讨论】:

  • 对于 Apache Spark 作业,文档指出“应用程序应该定义一个 main() 方法而不是扩展 scala.App。scala.App 的子类可能无法正常工作。”

标签: scala


【解决方案1】:

App trait 是一种创建可执行 scala 程序的便捷方式。与main方法的不同之处(除了明显的语法差异)App trait使用了延迟初始化特性。

来自 2.9 的发行说明(请参阅 http://www.scala-lang.org/old/node/9483

继承 App trait 的对象使用 Scala 2.9 的延迟初始化特性来执行整个主体作为继承的 main 方法的一部分。

App 方案的另一个新特性是命令行参数现在可以通过 args 值访问(继承自 trait App)

【讨论】:

  • 我的理解是否正确,没有 App 特性的好处,这个(应用程序)对象不会像任何其他 scala 对象一样 act - 在入口点是main 方法并且主体没有按预期执行。它是否在进入 main 后的某个时间点执行?
  • @RichardSitze 在App 特征中有一个main 方法,女巫get 混合到您的Application 对象中。除了延迟初始化是执行 Application 对象的主体这一事实之外,没有任何神奇之处。
【解决方案2】:

这两种情况在 scala 脚本上是不一样的。

object extends App 未被“scala MyObject.scala”命令执行, 但是包含 main 方法的对象是由“scala MyObject.scala”命令执行的。 这被描述为 scala 寻找具有主要脚本方法的对象。

当使用 Eclipse 的 REPL 或 scala 工作集时, 两种情况都需要显式调用MyObject.main(Array[String]())

这个简单的技巧对像我这样的初学者很有帮助。

【讨论】:

    【解决方案3】:

    App trait 是使用 [[DelayedInit]] 功能实现的,这意味着在执行 main 方法之前不会初始化对象的字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 2013-11-26
      • 1970-01-01
      相关资源
      最近更新 更多