В курсе Coursera Мартин Одерский утверждает, что scala полностью объектно-ориентирован, и показывает, что Boolean может быть определен как класс из первых принципов (вместо использования примитивного логического значения 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» для всех других методов, таких как «&&», ...) , Кроме того, почему он иногда использует реализацию по умолчанию "call by value", а иногда реализацию "call by name" ("=>")? Я знаю разницу между обоими, но почему это полезно здесь?
Заранее спасибо за время и помощь
* Принципы функционального программирования в Scala (неделя 4, лекция 4.1 «Объекты везде»)
Кодовая копия / вставлена с здесь