观看关于Martin Odersky的scala课程的4.2课程我不理解下面的课程或它的用法:
abstract class Boolean {
def ifThenElse[T](t: => T, e: => T): T
def && (x: => Boolean): Boolean = ifThenElse(x, False)
def || (x: => Boolean): Boolean = ifThenElse(True, x)
def unary_! : Boolean = ifThenElse(False , True)
def == (x: Boolean): Boolean = ifThenElse(x, x.unary_!)
def != (x: Boolean): Boolean = ifThenElse(x.unary_! , x)
object False extends Boolean {
def ifThenElse[T](t: => T, e: => T) = e
}
object True extends Boolean {
def ifThenElse[T](t: => T, e: => T) = e
}
}
可以提供样品实施/解释,以便我可以更好地提供正在发生和/或使用的内容吗?
答案 0 :(得分:5)
你对这门课究竟有什么不了解?
它定义了一个抽象类Boolean
,它有一个抽象方法ifThenElse
。两个对象False
和True
使用方法Boolean
的两个实现扩展了类ifThenElse
。
你可能犯了一个复制和粘贴错误,因为这两个实现是相同的; True
中的版本似乎有误,它应该如下所示:
object True extends Boolean {
def ifThenElse[T](t: => T, e: => T) = t // t, not e
}
课程Boolean
包含多种方法:&&
,||
,unary_!
,==
和!=
ifThenElse
的条款。
方法ifThenElse
需要两个by-name parameters,您可以看到,因为参数列表中的类型为=> T
。这意味着如果您在方法的实现中使用该名称,那么它将在那时进行评估。
答案 1 :(得分:5)
您的示例中包含了所有必需的实现。
Boolean
是一个抽象的超类,有两个具体的实现:True
和False
超类定义了布尔值的常见操作,将不同的行为委托给子类之间唯一不同的特定操作:方法ifThenElse
子类定义为object
s,因此只有一个实例。
要了解它们的工作原理,让我们举一些例子
/* we start with the basic values and call an if/else control
* implementation that prints "yes"/"no" depending on the target
*/
scala> True.ifThenElse(println("yes"), println("no"))
yes
scala> False.ifThenElse(println("yes"), println("no"))
no
/* we can negate */
scala> (! True).ifThenElse(println("yes"), println("no"))
no
scala> (! False).ifThenElse(println("yes"), println("no"))
yes
/* and do some algebra */
scala> (True && False).ifThenElse(println("yes"), println("no"))
no
scala> (True || False).ifThenElse(println("yes"), println("no"))
yes
/* or some equality tests */
scala> (True && True == True).ifThenElse(println("yes"), println("no"))
yes
scala> (False || True != True).ifThenElse(println("yes"), println("no"))
no
这只是使用 call-by-name 实现布尔运算的一种教育方法。正如您所看到的,每个调用只打印一个值,显示参数是“按需”而不是在调用站点进行评估的事实。
当然,这种符号使用起来相当麻烦,但它的意思是说明性而不实用,目标并非如此。