编辑: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/