如果类在单例对象之外,scala 命令会跳过运行 main

标签 scala

编辑:Main method is not called in Scala script是相关的(特别是 Régis Jean-Gilles 的回答)。这篇文章提供了更多细节来描述这个问题。而答案(通过 suish)给出了一个更实际的演示来解释 scala 命令的行为。

的内容MiniScalaApp.scala

object MiniScalaApp {
  def main(args: Array[String]) = {
    println(s"Scala Version: ${scala.util.Properties.scalaPropOrElse("version.number", "unknown")}")
    println(new Dinosaur("Tyrannotitan", 4900))
    println(new Dinosaur("Animantarx ", 300))
  }

  class Dinosaur (name:String, weightKG: Int) {
    override def toString = f"$name, Weight: $weightKG kg"
  }
}

在命令行执行:
$ scala /myProject/src/main/scala/MiniScalaApp.scala

产生预期的输出:

Scala Version: 2.11.7
Tyrannotitan, Weight: 4900 kg
Animantarx, Weight: 300 kg



但是,如果 Dinosaur 类位于单例对象 MiniScalaApp 之外,则 scala 命令不会产生控制台输出,也不会产生错误消息。
object MiniScalaApp {
  def main(args: Array[String]) = {
    println(s"Scala Version: ${scala.util.Properties.scalaPropOrElse("version.number", "unknown")}")
    println(new Dinosaur("Tyrannotitan", 4900))
    println(new Dinosaur("Animantarx ", 300))
  }
}

class Dinosaur (name:String, weightKG: Int) {
  override def toString = f"$name, Weight: $weightKG kg"
}

在第二个版本中,要获得控制台输出,必须先编译代码,然后单独运行 MiniScalaApp.class
$ scalac /myProject/src/main/scala/MiniScalaApp.scala
$ scala MiniScalaApp

问题 : scala 命令对代码的处理方式不同的原因是什么?

最佳答案

scala -help说明了一切。

A file argument will be run as a scala script unless it contains only self-contained compilation units (classes and objects) and exactly one runnable main method. In that case the file will be compiled and the main method invoked. This provides a bridge between scripts and standard scala source.



所以后一种情况是定义对象和类,它将作为脚本运行代码。
换句话说,它所做的和……完全一样。
scala> :paste
// Entering paste mode (ctrl-D to finish)

object MiniScalaApp {
  def main(args: Array[String]) = {
    println(s"Scala Version: ${scala.util.Properties.scalaPropOrElse("version.number", "unknown")}")
    println(new Dinosaur("Tyrannotitan", 4900))
    println(new Dinosaur("Animantarx ", 300))
  }
}

class Dinosaur (name:String, weightKG: Int) {
  override def toString = f"$name, Weight: $weightKG kg"
}

// Exiting paste mode, now interpreting.

defined object MiniScalaApp
defined class Dinosaur

只有定义。所以你需要明确地调用它。
MiniScalaApp.main(Array())

除此之外,object Foo extends App如果文件只有一个顶级对象,则不能使用。 def main是必须的。

关于如果类在单例对象之外,scala 命令会跳过运行 main,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37428310/

相关文章:

json - 我使用Scalaj请求时出现SocketTimeoutException

scala - 使用 Dispatch 执行简单的 HTTP GET

scala - Spark 数据集中的 max() 和 struct()

java - 如何轻松地将本地文件发送到 Scala 中的 Google Cloud Storage

scala - Scala 中为任何输入返回相同输出的函数

Scala 模式匹配守卫打破了模式匹配的穷尽性?

具有动态字段的Scala案例类复制构造函数

scala - Akka-http 在一个流中处理来自不同连接的 HttpRequests

java - 用于测试的 Scala vs Groovy vs Java

mysql - 如何在 MySQL 中为 Play 2 框架的 squeryl 中的 ManyToMany 关系设置中间表?