我有一个使用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
“包含”混合特性?
答案 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]) 初始化代码包括所有语句和所有值定义 在初始化期间执行。