原文:http://blog.sina.com.cn/s/blog_a3869e9a01017dcn.html
断言:
Scala里,断言对预定义方法 assert 的调用。表达式 assert(condition) 将在condition条件不成立的时候抛出 AssertionError。
assert也可带两个参数,表达式assert(condition, explanation) 会测试condition,如果条件不成立,会抛出含有指定explanation作为说明的AssertionError。explanation的类型是Any,所以可以把任何对象当作说明参数。assert方法会对传入的参数调用toString(),放在AssertionError中的字符串说明。
def above(that: Element): Element = {
val this1 = this widen that.width
val that1 = that widen this.width
assert(this1.width == that1.width)
elem(this1.contents ++ that1.contents)
}
另一种或许会使用断言的方式是在widen方法的结束处,在返回结果值之前,检查一下宽度是否正确。你可以这么做,首先把结果存在val里,然后对这个结果执行断言,并且如果断言成功,则返回val值。
不过,也可以使用 Predef 里的名为 ensuring 的方法来简化这些操作。
private def widen(w: Int): Element =
if (w <= width)
this
else {
val left = ...
val right = ...
left beside this beside right
} ensuring (w <= _.width)
由于存在隐式转换,因此 ensuring()能被用在任何结果类型上。尽管这段代码看上去好像是对widen的结果(类型Element)调用ensuring,但实际上是对Element隐式转换成的类型调用了ensuring。ensuring方法带一个函数做参数,该函数是接受一个结果类型对象并返回Boolean类型的论断函数(predicate function)。ensuring会把结果传给这个函数。如果函数返回true,ensuring将返回结果,否则,ensuring将抛出AssertionError。
例子中,论断函数是“w <= _.width”。下划线是传递给论断参数的占位符,即widen方法的结果Element。如果作为 w 被传入 widen 的宽度小于或等于结果 Element 的 width,预期函数将返回 true,于是 ensuring将返回被调用的 Element作为结果。因为这是 widen方法的最后一个表达式,所以 widen本身将返回 Element作为结果。
断言(以及ensuring检查)可以使用JVM的-ea和-da命令行标志开放和禁止。开放的时候,每个断言 被当做对使用软件运行时产生的实际数据进行的小测试。