scala对象扩展应用程序不打印任何东西

时间:2016-05-16 11:36:43

标签: scala main

我正在学习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()方法)。

我错过了什么吗?对此的任何帮助将受到高度赞赏。

2 个答案:

答案 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