保理应用程序特征

时间:2011-11-12 10:31:27

标签: scala

我有一个使用App特征的应用程序,它一切正常。但是从object继承的App变得有点笨拙,所以我想把一些功能分解成特征。特别是,我想拆分命令行参数处理。

不幸的是,这似乎与DelayedInit不太匹配。所以这很好用:

object Main extends App {
  println("arguments are: "+ args.mkString.mkString(", "))
}

但这会引发NullPointerException

trait CommandLineArguments { this: App =>
  println("arguments are: "+ args.mkString.mkString(", "))
}

object Main extends App with CommandLineArguments

有没有办法让DelayedInit“包含”混合特性?

1 个答案:

答案 0 :(得分:3)

看起来很奇怪,如果写这样的话,工作正常:

trait CommandLineArguments { self: App => 
  delayedInit {
     println("arguments are: "+ args.mkString.mkString(", "))
  }
}

但是来自scaladocs(http://www.scala-lang.org/api/current/index.html#scala.DelayedInit):

  

继承DelayedInit标记特征的类和特征将具有   他们的初始化代码重写如下。 [Code]变为delayedInit([Code])   初始化代码包括所有语句和所有值定义   在初始化期间执行。