Scala:使用CLI参数重新配置trait
我有一个Scala应用程序,其中几乎每个对象都扩展了一个特定的特性,它包含了几乎整个系统使用的所有主要函数和变量 我想在我的应用程序的命令行变量中添加一个Scala:使用CLI参数重新配置trait,scala,Scala,我有一个Scala应用程序,其中几乎每个对象都扩展了一个特定的特性,它包含了几乎整个系统使用的所有主要函数和变量 我想在我的应用程序的命令行变量中添加一个--testing标志,这将改变trait中某些函数的结果 简单地说,我希望main中接受的变量在被对象扩展之前具有改变trait中某些内容的效果,而不将其显式地发送给所有对象 你知道怎么做吗 我怀疑您是否真的想动态修改某个特性,我也不确定是否所有继承该特性的类都会受到影响。我对编译器和字节码了解不够 完成类似任务的一种方法是让你的特质接受一个
--testing
标志,这将改变trait中某些函数的结果
简单地说,我希望main
中接受的变量在被对象扩展之前具有改变trait中某些内容的效果,而不将其显式地发送给所有对象
你知道怎么做吗 我怀疑您是否真的想动态修改某个特性,我也不确定是否所有继承该特性的类都会受到影响。我对编译器和字节码了解不够 完成类似任务的一种方法是让你的特质接受一个参数,并使你的特质有条件地作用于该参数
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 {
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美分
更新
考虑将“testing”标志传递给trait的初始值设定项块,如下所示:
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()
考虑将“testing”标志传递给trait的初始值设定项块,如下所示:
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()
你能为你想要实现的目标添加一个简单的例子吗?这个问题现在有很多解释,并将以“过于宽泛”的方式结束。另请参阅:如果它真的只是用于测试,那么使用Mockito的scalatest可以帮助您。您可以添加一个简单的示例来说明您想要实现的目标吗?这个问题现在有很多解释,并将以“过于宽泛”的方式结束。另请参见:如果它真的只是用于测试,那么使用Mockito的scalatest可以帮助您。尽管我想知道是否有一种方法可以让我只发送一次参数,而不是每次对象加载和调用trait时发送一次。@shakedzy是的,您可以将
布尔值
放在伴随对象中。它的工作原理类似于Java中的公共静态变量。请注意,在运行时更改它会更改trait的行为。虽然我想知道是否有一种方法可以让我只发送一次参数,而不是每次对象加载和调用trait时都发送一次参数。@shakedzy是的,您可以将布尔值
放在伴生对象中。它的工作原理类似于Java中的公共静态变量。请注意,在运行时更改它会更改该特性的行为。