在coursera课程*中,Martin Odersky认为scala是完全面向对象的,并表明布尔值可以从第一原理定义为一个类(而不是使用JVM的原始布尔值(。
他定义替代布尔类如下:
package week4
abstract class Boolean2 {
def ifThenElse[T](t: => T, e: => T): T
def && (x: => Boolean2): Boolean2 = ifThenElse(x, False)
def || (x: => Boolean2): Boolean2 = ifThenElse(True, x)
def unary_! : Boolean2 = ifThenElse(False, True)
def == (x: Boolean2): Boolean2 = ifThenElse(x, x.unary_!)
def != (x: Boolean2): Boolean2 = ifThenElse(x.unary_!, x)
def < (x: Boolean2): Boolean2 = ifThenElse(False, x)
}
object True extends Boolean2 {
def ifThenElse[T](t: => T, e: => T) = t
}
object False extends Boolean2 {
def ifThenElse[T](t: => T, e: => T) = e
}
我想知道为什么他有时会使用类型"T",有时根据方法键入"Boolean2"("T"表示"ifThenElse","Boolean2"表示所有其他方法,如"&&",...(。此外,为什么他有时使用默认的"按值调用"实现,有时使用"按名称调用"("=>"(实现?我知道两者之间的区别,但为什么它在这里有用?
提前感谢您的时间和帮助
*Scala中的函数式编程原理(第4周,第4.1讲:无处不在的对象(
从此处复制/粘贴代码
>T
是ifThenElse
函数中 then-block 和 else-block 的返回类型,这可以是任意类型,但必须匹配两个块。
按名称调用仅用于执行将根据条件返回的ifThenElse
块。 如果使用按值调用,则在调用ifThenElse
函数之前将计算这两个块。这不仅是一种性能优化,而且除了例外或未终止计算之外,与if ... then ... else
中的构建相比,它还会改变ifThenElse
的语义