加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

获取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
  }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读