获取Scala特征中的命令行参数
发布时间:2020-12-16 18:07:42 所属栏目:安全 来源:网络整理
导读:我有大量简单的命令行 Scala应用程序,它们共享相当多的常见结构.所有这些都继承自scala.App,这很好.我想将这些命令行应用程序的共享结构重构为一个共同特征,然后我可以将其继承到我的(更简单的)命令行应用程序类中.问题出现在一些常见结构中包括解析命令行参
我有大量简单的命令行
Scala应用程序,它们共享相当多的常见结构.所有这些都继承自scala.App,这很好.我想将这些命令行应用程序的共享结构重构为一个共同特征,然后我可以将其继承到我的(更简单的)命令行应用程序类中.问题出现在一些常见结构中包括解析命令行参数.
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 } 这可以编译,但是在实际取消引用args的时候会出现NPE失败,可能是因为App特性尚未初始化.更改特征顺序并将BaseScript中的App继承更改为自我类型声明不做任何操作,就像使用DelayedInit进行实验一样.在BaseScript中将组件声明为“懒惰”可以工作,但我还希望在初始化期间实际使用这些组件(例如,设置日志目录并根据配置加载JDBC驱动程序类),因此懒惰的好处就会丢失.我能做些什么来使命令行参数在BaseScript特性中可见和初始化? 解决方法
我认为您最好的选择是将BaseScript特性更改为一个类,原因有两个.第一个是与类相比,特性初始化以相反的顺序执行.请参阅
this question on initialization behavior.其次,BaseScript在语义上比其他行为更像是一个超类.我想你会发现这可以简化事情.
执行MyScript时,以下代码首先初始化BaseScript类. BaseScript依次依赖于App trait并强制它首先初始化. object MyScript extends BaseScript { //small bits of business logic using components defined in BaseScript println( "running" ) println( "arg(0): " + configuration ) } class BaseScript extends App { val configuration = loadConfiguration(args) //setup a bezillion components,based on the configuration def loadConfiguration( args: Array[String] ) = { println( "configuring" ) if ( args.length > 0 ) args(0) else null } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |