Scala:使用CLI参数重新配置trait

Scala:使用CLI参数重新配置trait,scala,Scala,我有一个Scala应用程序,其中几乎每个对象都扩展了一个特定的特性,它包含了几乎整个系统使用的所有主要函数和变量 我想在我的应用程序的命令行变量中添加一个--testing标志,这将改变trait中某些函数的结果 简单地说,我希望main中接受的变量在被对象扩展之前具有改变trait中某些内容的效果,而不将其显式地发送给所有对象 你知道怎么做吗 我怀疑您是否真的想动态修改某个特性,我也不确定是否所有继承该特性的类都会受到影响。我对编译器和字节码了解不够 完成类似任务的一种方法是让你的特质接受一个

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

我想在我的应用程序的命令行变量中添加一个
--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中的公共静态变量。请注意,在运行时更改它会更改该特性的行为。