解释一个scala类和对象?

时间:2013-04-22 12:26:26

标签: scala

观看关于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
  }

}

可以提供样品实施/解释,以便我可以更好地提供正在发生和/或使用的内容吗?

2 个答案:

答案 0 :(得分:5)

你对这门课究竟有什么不了解?

它定义了一个抽象类Boolean,它有一个抽象方法ifThenElse。两个对象FalseTrue使用方法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是一个抽象的超类,有两个具体的实现:TrueFalse

超类定义了布尔值的常见操作,将不同的行为委托给子类之间唯一不同的特定操作:方法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 实现布尔运算的一种教育方法。正如您所看到的,每个调用只打印一个值,显示参数是“按需”而不是在调用站点进行评估的事实。

当然,这种符号使用起来相当麻烦,但它的意思是说明性而不实用,目标并非如此。