在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”(对于“ ifThenElse”为“ T”,对于所有其他方法,如“ &&”,则为“ Boolean2”,...) 。此外,为什么他有时使用默认的“按值调用”实现,而有时使用“按名称调用”(“ =>”)实现?我知道两者之间的区别,但是为什么在这里有用?
提前感谢您的时间和帮助
* Scala中的函数式编程原理(第4周,第4.1讲,对象无处不在)
从here复制/粘贴代码
答案 0 :(得分:3)
T
是ifThenElse
函数中then块和else块的返回类型,它可以是任意类型,但必须与两个块都匹配。
根据名称调用仅用于执行ifThenElse
块,该块将根据条件返回。
如果您要使用按值调用,则将在调用ifThenElse
函数之前对两个块进行评估。与ifThenElse
中的构建相比,这不仅是性能优化,而且在例外情况或不终止计算的情况下,还将改变if ... then ... else
的语义。