我正在学习Scala,作为旅程的一部分,我遇到了两种不同的编写scala类的方法 - 一种使用main方法,另一种使用main方法但是通过扩展App(早期应用程序 已弃用。
我通过scala
可执行文件scala <nameOfScript>.scala
在命令行中执行脚本。我在 Windows 中运行 Scala 2.11.7 。
使用main方法运行scala脚本/类时没有问题。
object ObjectWithMainMethod {
def main(args:Array[String]) = {
println("Object with a main() method executed..")
}
}
它产生以下输出。
Object with a main() method executed..
但是,我没有获得其对应的输出,这是扩展App特性但没有主要方法。
object AppWithoutMainMethod extends App {
println("AppWithout main() method executed")
}
当我运行此scala脚本时,它不会打印任何内容。但是,当我通过 javap 实用程序查看编译的.class文件时,我可以在里面看到PSVM(public static void main()方法)。
我错过了什么吗?对此的任何帮助将受到高度赞赏。
答案 0 :(得分:3)
如果您运行scala -help
,您会看到此评论:
文件参数将作为scala脚本运行,除非它仅包含 自包含的编译单元(类和对象)和正好一个 可运行的主要方法。在这种情况下,文件将被编译和 调用main方法。这提供了脚本和标准之间的桥梁 斯卡拉来源。
这完全解释了您所看到的内容 - scala
命令主要用于执行&#34;脚本&#34;或一系列表达式 - 用于快速,交互式评估代码段。它只运行&#34;应用程序&#34; (即使用main方法的对象)作为&#34;特殊情况&#34;,因为有意义的是用户会尝试以这种方式使用它。所以:
scala ObjectWithMainMethod.scala
时,将识别主方法并且命令输入此特殊情况&#34;,确定您可能意味着它以这种方式工作scala AppwithoutMainMethod.scala
时,即使App
采用main
方法,也不会将其识别为&#34;特殊情况&#34;但就像一系列表达式一样,所以不调用主要方法。 如果您将类编译成.class
个文件并通过java -cp <classpath> <class-name>
命令运行它们,那么这两个文件将产生相同的结果。
答案 1 :(得分:-1)
如果我运行没有.scala
扩展名的文件,同样的事情也有效。我不确定这背后的原因。
scala AppWithoutMainMethod
它产生以下输出
AppWithout main() method executed