编辑: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命令以不同方式处理代码的原因是什么?
答案 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 App
。def 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);