Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在使用TableDrivenPropertyChecks时混合特征时无法编译_Scala_Scalatest - Fatal编程技术网

Scala 在使用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 =>

我在编译以下代码时遇到问题

我正在使用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放在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的多个实例,每个实例都获得了一个稳定的值实现