我在编译以下代码时遇到问题。
我正在使用TableDrivenPropertyChecks,并且我有类似的东西
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 outside the 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
}
}
}
但是我想知道为什么失败
答案 0 :(得分:1)
您的原始示例由于作用域而无法编译。如果在顶部作用域上创建new MyTrait
,但在循环内定义val foo = item
,则该val只是闭包内部的局部变量。如果您考虑一下,这是很合逻辑的,MyTrait
的单个实例不可能具有相同属性的多个实现。在您的解决方案中,您创建了MyTrait
的多个实例,每个实例都获得了value
的单个稳定实现。