在Scala中使用App特质和主要方法之间的区别


87

之间有什么区别

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

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


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

Answers:


64

App特质是创建可执行Scala程序的便捷方式。与主要方法的区别在于(除了明显的语法差异之外),App特质使用了延迟的初始化功能。

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

继承了App特性的对象将利用Scala 2.9的延迟初始化功能将整个主体作为继承的main方法的一部分执行。

App方案的另一个新功能是现在可以通过args值(从trait App继承来)访问命令行参数。


我在我的理解是正确的,没有应用程式性状的利益,这(应用程序)对象不采取行动像任何其他斯卡拉对象-在入口点是main方法和无法按预期执行机构。进入main后在某个时候执行吗?
理查德·西兹

@RichardSitzemainApp女巫特质中有一种方法可以混入您的Application对象中。除了延迟初始化是执行Application对象主体的事实之外,没有任何魔术可言。
埃米尔·H

4

这两种情况在scala脚本上不同。

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

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

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


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.