Scala:使用CLI参数重新配置特征

时间:2016-11-20 10:00:01

标签: scala

我有一个Scala应用程序,几乎每个对象都扩展了一个特定的特征,它包含几乎整个系统使用的所有主要函数和变量。

我想在我的应用程序的命令行变量中添加一个--testing标志,这将改变特征中某些函数的结果。

简单地说,我希望main中接受的变量具有一种效果,可以在对象扩展之前改变特征中的某些内容 - 而不会将其显式发送给所有对象。

任何想法如何执行?

2 个答案:

答案 0 :(得分:2)

我怀疑你是否真的想动态修改特征,我不确定是否有可能继承该特征的所有类都会受到影响。我对编译器和字节码知之甚少。

实现类似功能的一种方法是让你的特性采用参数,并使你的特质在参数上有条件地起作用。

trait Foo {
  val testing: Boolean

  def fn1(): Unit = {
    if (testing) {
      println("testing")
    } else {
      println("production")
    }
  }
}

class Bar(val testing: Boolean) extends Foo {
  def fn2(): Unit = {
    fn1()
  }
}

new Bar(true).fn2()
new Bar(false).fn2()

你的问题很广泛,这只是我的5美分。

更新

trait Foo {
  def fn1(): Unit = {
    if (Foo.testing) {
      println("testing")
    } else {
      println("production")
    }
  }
}

object Foo {
  var testing: Boolean = false
}

class Bar extends Foo {
  def fn2(): Unit = {
    fn1()
  }
}

object SOApp extends App {
  new Bar().fn2()
  Foo.testing = true
  new Bar().fn2()
}

答案 1 :(得分:0)

考虑通过'测试'标记到特征的初始化程序块,如下所示:

trait MyTrait {
  var testMode: Boolean = _
  def doSomething(): Unit = { 
    if (testMode) 
      println("In Test Mode") 
    else
      println("In Standard Mode") 
  }
}

// IMPORTANT:  Your best bet would be to create some Config object
//             that is loaded and initialized in a main method.

// Define test-specific Config class:
case class Config(testMode: Boolean) {
  def isTestMode: Boolean = this.testMode
}

// Instantiate in main method:
val config = new Config(true)

// Later, extend the trait:
class MyObj extends MyTrait { testMode = config.isTestMode() }

// Then just invoke
new MyObject().doSomething()