traitApp extends DelayedInit
简单来说,App特质可以快速将一个objects变成一个可执行程序,它内部实现了main的方法。注意:真正的功能实现使用DelayedInit来实现,这意味着object的fields在main方法执行前不会被初始化。这个类一般用于多线程应用等实现。
示例如下
1 2 3 |
object Main extends App { Console.println("Hello World: " + (args mkString ", ")) } |
这里Main继承了App特质中的main方法,args返回了当前命令行参数的数组。
scala.App代码分析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
package scala import scala.compat.Platform.currentTime import scala.collection.mutable.ListBuffer trait App extends DelayedInit { //executionStart为当前应用执行的UTC时间(in milliseconds since 1 January 1970 UTC.),即为main方法执行的时间。 val executionStart: Long = currentTime //init hook,保存所有执行main函数所需的初始化代码,这些初始化代码不会被用户代码所调用, //而是用于编译器为DelayedInit特质中继承的类所使用。delayedInit重写了DelayedInit的方法。 private val initCode = new ListBuffer[() => Unit] override def delayedInit(body: => Unit) { initCode += (() => body) } protected def args: Array[String] = _args private var _args: Array[String] = _ //main函数,将所有的main函数中的args保存在_args中,而初始化代码将传递给DelayedInit特质。 def main(args: Array[String]) = { this._args = args for (proc <- initCode) proc() //App包含一个实用的小工具:计时器。如果系统属性scala.time传递给了该App(例如:scala -Dscala.time com.debugo.myApp),则会输出运行时间统计。 if (util.Properties.propIsSet("scala.time")) { val total = currentTime - executionStart Console.println("[total " + total + "ms]") } |
下面的例子使用了scala.App来实现一个trait之间的继承:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
trait Logger{ def log(msg: String): Unit ={ println("log:" + msg) } } class MyLogger extends Logger { def mylog: Unit ={ log("mylog") } } object UseApp extends App{ val logger = new MyLogger logger.mylog } |
执行结果:
1 2 |
log:mylog [success] Total time: 3 s, completed 2014-11-4 13:53:53 |
参考
Scala 10.4 Source
领现金
盈和亚洲企鹅1813712617
丝袜会所ﻳ只穿丝袜ﻳ纹身丝袜ﻳ美女丝袜论坛ﻳ无内丝袜ﻳmeinv95.com
丝足
日本少女人体艺术妈咪的诱惑mm88.ml
ℰ1:1 Balenciaga(巴黎世家)LUZ(路姿)Maison Martin Margiela(梅森●马丁●马吉拉)BOSSOFF WHITE(Off White)shechipin.ml
…………….
主视觉车前面的三辆车都带着刹车