您想使用按名称调用的参数,我相信以下内容就足够了:
implicit def extendedBoolean(a : Boolean) = new {
def implies(b : => Boolean) = {
!a || b
}
}
解释:
您必须在 for 中传递一些值,b
但您不希望评估该表达式;Scala 可以自动将表达式转换为不带参数并计算表达式的函数。implies
然后,如果需要,您的操作员会评估该空值(零参数)函数。
由于您提供的类型签名,编译器知道它可以执行此转换,=> Boolean
. 这篇文章更详细地解释了,但仅它的标题就很好地概括了正在发生的事情:“Automatic Type-Dependent Closure Construction”。
Scala 的这一特性使人们能够编写控制结构,可能就像使用其他语言中的宏来编写它们一样容易。观察他们使用两个按名称调用的参数重新实现 while 循环的难易程度:一个用于条件,一个用于主体。
object TargetTest2 extends Application {
//type signature not too terribly mysterious
def whileLoop(cond: => Boolean)(body: => Unit): Unit =
if (cond) {
body
whileLoop(cond)(body)
}
//about as easy to use as a plain-old while() loop
var i = 10
whileLoop (i > 0) {
println(i)
i -= 1
}
}