替代布尔类来激励 scala 是完全面向对象的



在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讲:无处不在的对象(

从此处复制/粘贴代码

>TifThenElse函数中 then-block 和 else-block 的返回类型,这可以是任意类型,但必须匹配两个块。

按名称调用仅用于执行将根据条件返回的ifThenElse块。 如果使用按值调用,则在调用ifThenElse函数之前将计算这两个块。这不仅是一种性能优化,而且除了例外或未终止计算之外,与if ... then ... else中的构建相比,它还会改变ifThenElse的语义

最新更新