在Scala中调用超级方法

时间:2016-06-06 12:55:52

标签: scala specs2

在specs2中编写测试用例时,我遇到了这段代码。

abstract class WithDbData extends WithApplication {
  override def around[T: AsResult](t: => T): Result = super.around {
    setupData()
    t
  }

  def setupData() {
    // setup data
  }
}

"Computer model" should {

  "be retrieved by id" in new WithDbData {
    // your test code
  }
  "be retrieved by email" in new WithDbData {
    // your test code
  }
}

这是link。 请解释super.around在这种情况下的工作原理?

1 个答案:

答案 0 :(得分:2)

班级around中的WithApplication方法具有以下签名:

def around[T](t: ⇒ T)(implicit arg0: AsResult[T]): Result

让我们忽略隐含的论证,这对于这个解释并不感兴趣。

它需要call-by-name parameter (t: ⇒ T),并且在around类的WithDbData方法中,它会被一个块调用,这是{ ... }之后的super.around {1}}。该块是作为参数t传递的。

另一个简单的例子,说明你可以用这个做什么:

// Just using the name 'block' inside the method calls the block
// (that's what 'call-by-name' means)
def repeat(n: Int)(block: => Unit) = for (i <- Range(0, n)) {
  block   // This calls the block
}

// Example usage
repeat(3) {
  println("Hello World")
}