【问题标题】:scala object extends app does not print anythingscala object extends app 不打印任何东西
【发布时间】:2016-09-12 04:31:53
【问题描述】:

我正在学习 Scala,作为旅程的一部分,我遇到了两种不同的方式来编写你的 scala 类 - 一种使用 main 方法,另一种没有 main 方法,但通过扩展 App(之前的 Application 由于并发问题,已弃用)。

我正在通过scalascala <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 特征但没有 main 方法。

object AppWithoutMainMethod extends App {
    println("AppWithout main() method executed")
}

当我运行这个 scala 脚本时,它不会打印任何东西。但是,当我通过 javap 实用程序查看编译的 .class 文件时,我可以看到里面的 PSVM(公共静态 void main() 方法)。

我错过了什么吗?对此的任何帮助将不胜感激。

【问题讨论】:

  • “当我运行这个 scala 脚本时” - 如何 你是如何运行这个的?代码看起来不错,所以问题可能在于执行......
  • @TzachZohar,我在命令行上使用“scala”可执行文件作为scala AppwithoutMainMethod.scala运行它

标签: scala main


【解决方案1】:

如果你运行scala -help,你会看到这条评论:

文件参数将作为 scala 脚本运行,除非它只包含 自包含的编译单元(类和对象)和正好一个 可运行的主要方法。在这种情况下,文件将被编译并且 调用的主要方法。这提供了脚本和标准之间的桥梁 斯卡拉源代码。

这准确解释了您所看到的 - scala 命令主要用于执行“脚本”或一系列表达式 - 用于快速、交互式地评估代码 sn-ps。它仅将“应用程序”(即具有 main 方法的对象)作为“特殊情况”运行,因为用户会尝试以这种方式使用它是有意义的。所以:

  • 当您运行 scala ObjectWithMainMethod.scala 时,会识别出 main 方法,并且命令会进入这个“特殊情况”,这表明您可能打算让它以这种方式工作
  • 当您运行scala AppwithoutMainMethod.scala 时,即使App 具有main 方法,这也不是“特殊情况”,而是一系列表达式,因此不会调用main 方法。

如果你将你的类编译成.class 文件并通过java -cp <classpath> <class-name> 命令运行它们,两者将产生相同的结果。

【讨论】:

  • 感谢您的回复。但是,这个没有 main 方法的脚本应该如何或何时执行?
  • 无论我指的是什么书籍和网上资料,几乎都说这两者是相同的(有main方法,没有main方法但扩展App trait)。是不是很矛盾?
  • 这被认为是一个错误并在 2.11.9 中修复,如问题 @som-snytt 链接中所述。
【解决方案2】:

如果我在没有.scala 扩展名的情况下运行文件,同样的效果。我不确定这背后的原因。

scala AppWithoutMainMethod

它产生以下输出

AppWithout main() method executed

【讨论】:

  • 你可以指定scala -howtorun:help 看看如何告诉它要执行什么。在这里,您让它猜测您想要运行预编译的类,这是java 运行器的正常行为。使用.scala 扩展名,它会猜测script,这意味着它必须检查脚本以选择入口点,因为在Scala 中,源文件名和公共类名之间没有必要的对应关系。
  • 这不是答案;另一个答复是答复。请参阅我的评论,了解为什么此回复会让读者感到困惑。也就是说,这里你没有在“脚本”模式下运行,源代码被重新编译。 “离开 .scala 部分”不是如何运行脚本。
猜你喜欢
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 2016-12-11
  • 2018-12-03
  • 1970-01-01
相关资源
最近更新 更多