我有一个Scala应用程序,几乎每个对象都扩展了一个特定的特征,它包含几乎整个系统使用的所有主要函数和变量。
我想在我的应用程序的命令行变量中添加一个--testing
标志,这将改变特征中某些函数的结果。
简单地说,我希望main
中接受的变量具有一种效果,可以在对象扩展之前改变特征中的某些内容 - 而不会将其显式发送给所有对象。
任何想法如何执行?
答案 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()