特质中的懒惰断言

时间:2016-11-19 00:09:51

标签: scala

我发现我偶尔想在特征中写一个任意断言,或者在其他我想要断言的东西尚未完全定义的地方。

trait Foo {
  val aList: List[String]
  val anotherList: List[String]

  def printPairs = aList.zip(anotherList).foreach(println)

  assert(aList.size == anotherList.size) // NullPointerException, because these references are undefined right now.
}

我认为我正在寻找的一个概括是一个钩子(总是)在完全定义和实例化类之后触发,因为这是我通常放在构造函数中的那种检查。

1 个答案:

答案 0 :(得分:1)

你可以使用早期定义(在Scala Language Reference中搜索它以获取更多信息) - 使用与你编写的特征完全相同的特性,你可以按如下方式扩展它:

class Bar(l1: List[String], l2: List[String]) extends {
  val aList = l1
  val anotherList = l2
} with Foo

哪会在调用assert之前启动列表,因此:

new Bar(List("a", "b"), List("c", "d")) // built successfully
new Bar(List("a", "b"), List("c", "d", "e")) // throws exception

当然 - 它并不完全是你所要求的(在构造之后总是被称为“钩子”),因为任何扩展类都必须知道哪些成员必须“早期”被覆盖,但据我所知,这是最近的你可以得到。