scala命令跳过在singleton对象之外运行main if class

时间:2016-05-25 05:13:27

标签: scala

编辑:Main method is not called in Scala script是相关的(特别是RégisJean-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版本:2.11.7
  Tyrannotitan,重量:4900千克
  Animantarx,重量: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"
}

在第2版中,要获得控制台输出,必须首先编译代码,然后单独运行MiniScalaApp.class

$ scalac /myProject/src/main/scala/MiniScalaApp.scala
$ scala MiniScalaApp

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

2 个答案:

答案 0 :(得分:1)

scala -help解释了所有。

  

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

所以后一种情况是定义对象和类,它将代码作为脚本运行。 换句话说,它的作用与......完全相同。

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())

除此之外,如果文件只有一个top-lebel对象,则不能使用object Foo extends Appdef main是必需的。

答案 1 :(得分:0)

如果有超过1个顶级类/对象,您似乎需要显式调用main方法:

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.main(args);

见这里:Main method is not called in Scala script