Scala 在使用TableDrivenPropertyChecks时混合特征时无法编译
我在编译以下代码时遇到问题 我正在使用TableDrivenPropertyChecks,我有这样的东西Scala 在使用TableDrivenPropertyChecks时混合特征时无法编译,scala,scalatest,Scala,Scalatest,我在编译以下代码时遇到问题 我正在使用TableDrivenPropertyChecks,我有这样的东西 trait MyTrait{ def foo: String } "A X" should "do something correctly" in new MyTrait { val items = Table( "id", "1" ) forAll(items) { item =>
trait MyTrait{
def foo: String
}
"A X" should "do something correctly" in new MyTrait {
val items =
Table(
"id",
"1"
)
forAll(items) { item =>
val foo = item
//test condition
}
}
代码失败,并显示以下消息:
无法创建对象,因为MyTrait中的成员值foo:String未定义
我怎样才能解决这个问题?如果我用任意字符串将override val foo放在forAll之外,它会编译,例如
"A X" should "do something correctly" in new MyTrait {
val items =
Table(
"id",
"1"
)
override val foo = "1" //compiles
forAll(items) { item =>
//test condition
}
}
更新
我通过这样做解决了这个问题
"A X" should "do something correctly" in { // take out the new MyTrait here
val items =
Table(
"id",
"1"
)
forAll(items) { item =>
new MyTrait { //create my trait here
override val value = item
//test condition
}
}
}
但是我想知道为什么它失败了您的原始示例由于范围限制而无法编译。如果在顶部作用域上创建新的MyTrait,但在循环中定义val foo=item,那么该val只是闭包中的局部变量。仔细想想,这是很合乎逻辑的,一个MyTrait实例不可能有同一属性的多个实现。在您的解决方案中,您创建了MyTrait的多个实例,每个实例都获得了一个稳定的值实现