我有大量简单的命令行Scala应用程序,这些应用程序共享相当多的常见结构。他们都从scala.App继承,这很好。我想将这些命令行应用程序的共享结构重构为一个共同的特征,然后我可以继承我的(更简单的)命令行应用程序类。问题在于一些常见的结构包括解析命令行参数。在Scala特征中获取命令行参数
object MyScript extends BaseScript with App{
//small bits of business logic using components defined in BaseScript
}
trait BaseScript extends App{
val configuration = loadConfiguration(args(0))
//setup a bezillion components, usable from any of the scripts, based on the configuration
}
这将编译,但无法与NPE,当涉及到实际取消引用args
,大概是因为App
特质尚未初始化时间。像使用DelayedInit一样进行实验,更改特征顺序并将BaseScript中的App继承更改为自我类型声明什么也不做。在BaseScript中将组件声明为“懒惰”是可行的,但我也希望在初始化期间实际使用这些组件(例如,根据配置设置日志目录并加载JDBC驱动程序类),因此懒惰的好处将会丢失。有什么我可以做的,让命令行参数在BaseScript特征中可见和初始化?
没有多少我可以添加除了检查scopts:https://github.com/jstrachan/scopt – wheaties