SCALA 程序的几种运行方式
方法1
脚本式的使用,scala a.scala
可正常打印1
2
3
4def main() = {
println("Hello, Scala way1")
}
main()
但这种写法不能被 scalac a.scala
正确编译,可能JVM对象必须要有个main入口函数
方法2 object main
Java中一个类要独立运行,必须具有静态的main方法,如下1
2
3public static void main(String[] args) {
...
}
scala 种借鉴了这种方法,为了独立运行一个SCALA程序,必须定义一个scala object并且为其定义main方法
命令行scala a.scala
会直接运行main函数,其中args为命令行参数
1 | object RunAppDemo { |
Scala中的Object相当于java中的静态类,在其上可以定义静态的方法。Scala允许一个类定义自己的“伴生对象”(Companion Object),
它们具有相同的名字,必须位于同一个文件中,并且可以互相引用各自的私有成员。Scala的Object也可以独立存在。
如果一个Scala Object没有伴生对象,我们称之为“独立对象”(Standardalone Object),反之,对象和类互为友元。
上述代码main方法中的参数args是从命令行中传入的参数列表,具体用法和java类似。
如果a.scala 定义两个main函数,会默认执行第一个出现的main函数1
2
3
4
5
6
7
8
9
10
11
12object RunAppDemo {
def main(args:Array[String]) {
println("Hello, Scala within object main")
args.map(println)
}
}
object RunAppDemo2 {
def main(args:Array[String]) {
println("Hello, Scala within object main2")
}
}
方法3 extends App
为了使代码更简洁,Scala还提供了另外一种运行Scala程序的方式,那就是直接继承scala.App接口(Trait)。
1 | object RunAppWithoutMain extends App { |
之所以这里无须定义main方法,那是因为在App这个接口中定义了一个main方法,
main方法在执行时会初始化RunAppWithoutMain这个对象,并执行它的主构造方法,而所
有直接写在对象中的代码都会被scala编译器收集到主构造方法中,于是就被运行了。
这种方法虽然省略了一些代码,但是也有一些副作用。
直接继承自Application导致的副作用:
- 无法接受命令行参数。因为args参数不会被传入
- 在Scala中,如果一个程序是多线程的,那么这个程序必须具有一个main方法。所以这种写法只能适用于单线程的程序
- App这个接口在执行一个程序的代码之前,需要进行一些初始化。而某些JVM不会对这些初始化代码进行优化。
所以第二种方法只适用于一些非常简单的场合,大部分情况不推荐使用。