我正在学习Scala,作为旅程的一部分,我遇到了两种不同的方法来编写您的Scala类-一种是使用主方法,另一种没有主方法,而是通过扩展应用程序(早期的Application由于并发问题而被弃用)。
我正在通过可执行为scala <nameOfScript>.scala
的scala
执行命令行中的脚本。我在Windows中运行Scala2.11.7。
使用main方法运行scala脚本/类时,我没有任何问题。
object ObjectWithMainMethod {
def main(args:Array[String]) = {
println("Object with a main() method executed..")
}
}
它产生以下输出。
Object with a main() method executed..
但是,我没有得到它的输出,它扩展了应用程序特性,但没有主方法。
object AppWithoutMainMethod extends App {
println("AppWithout main() method executed")
}
当我运行这个scala脚本时,它不会打印任何内容。然而,当我通过javap实用程序查看composed.class文件时,我可以看到里面的PSVM(public static void main()方法)。
我是不是错过了什么?如有任何帮助,我们将不胜感激。
如果运行scala -help
,您将看到以下注释:
文件参数将作为scala脚本运行,除非它只包含自包含的编译单元(类和对象)和恰好是一个可运行的主方法。在这种情况下,文件将被编译调用了main方法。这提供了脚本和标准之间的桥梁scala源。
这正好解释了您所看到的内容——scala
命令主要用于执行"脚本"或一系列表达式——以便快速、交互式地评估代码片段。它只作为"特殊情况"运行"应用程序"(即具有主方法的对象),因为用户会尝试以这种方式使用它是有道理的。因此:
- 当您运行
scala ObjectWithMainMethod.scala
时,主方法被识别,并且命令进入这个"特殊情况",弄清楚您可能是想让它以这种方式工作 - 当您运行
scala AppwithoutMainMethod.scala
时,即使App
有一个main
方法,它也不会被识别为"特殊情况",而是被识别为一系列表达式,因此不会调用主方法
如果将类编译到.class
文件中,并通过java -cp <classpath> <class-name>
命令运行它们,则两者将产生相同的结果。
如果我运行没有.scala
扩展名的文件,同样的事情也会发生。我不确定这背后的原因。
scala AppWithoutMainMethod
它产生以下输出
AppWithout main() method executed