这是一个简单的程序。我希望main
能够以解释模式运行。但是另一个物体的存在导致它什么都不做。如果QSort
不存在,程序就会执行。
为什么在REPL中运行它时没有调用main
?
object MainObject{
def main(args: Array[String])={
val unsorted = List(8,3,1,0,4,6,4,6,5)
print("hello" + unsorted toString)
//val sorted = QSort(unsorted)
//sorted foreach println
}
}
//this must not be present
object QSort{
def apply(array: List[Int]):List[Int]={
array
}
}
编辑:很抱歉造成混淆,我正在以scala filename.scala
运行脚本。
答案 0 :(得分:14)
如果scala
的参数是现有的.scala文件,它将在内存中编译并运行。 当存在单个顶级对象时,将搜索主方法,如果找到,则执行。如果不是这种情况,则顶级语句将包含在合成主方法中,而后者将被执行。
这就是为什么删除顶级QSort对象可以让你的main方法运行。
如果您要将其扩展为完整程序,我建议编译并运行(使用sbt
之类的构建工具)编译的.class文件:
scalac main.scala && scala MainObject
如果您正在编写单个文件脚本,只需删除main方法(及其对象)并在外部作用域中编写要执行的语句,如:
// qsort.scala
object QSort{
def apply(array: List[Int]):List[Int]={
array
}
}
val unsorted = List(8,3,1,0,4,6,4,6,5)
print("hello" + unsorted toString)
val sorted = QSort(unsorted)
sorted foreach println
并使用:scala qsort.scala
scala
命令用于执行scala“脚本”(单个文件程序)和复杂的类java程序(带有主对象和类路径中的一堆类)。
来自man scala
:
The scala utility runs Scala code using a Java runtime environment.
The Scala code to run is specified in one of three ways:
1. With no arguments specified, a Scala shell starts and reads com-
mands interactively.
2. With -howtorun:object specified, the fully qualified name of a
top-level Scala object may be specified. The object should pre-
viously have been compiled using scalac(1).
3. With -howtorun:script specified, a file containing Scala code
may be specified.
如果没有明确指定,则从传递给脚本的参数中猜出howtorun
模式。
当给定对象的完全限定名称时,scala
将猜测-howtorun:object
并期望路径上具有该名称的编译对象。
否则,如果scala
的参数是现有的.scala文件,则会猜到-howtorun:script
,并按上述方式选择入口点。
答案 1 :(得分:11)
对象模块的任何方法都可以在REPL中运行,方法是显式指定它并为其提供所需的参数(如果有的话)。例如:
scala> object MainObject{
| def main(args: Array[String])={
| val unsorted = List(9,3,1,0,7,5,9,3,11)
| print("sorted: " + unsorted.sorted)
| }
| def fun = println("fun here")
| }
defined module MainObject
scala> MainObject.main(Array(""))
sorted: List(0, 1, 3, 3, 5, 7, 9, 9, 11)
scala> MainObject.fun
fun here
在某些情况下,这可用于快速测试和故障排除。