4

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

}

是否可以提供示例实施/解释,以便我可以更好地提供正在发生的事情和/或其用途?

4

2 回答 2

5

你对这门课有什么不明白的地方?

它定义了一个抽象类Boolean,它有一个抽象方法,ifThenElse。两个对象False和使用方法的两个实现True扩展类。BooleanifThenElse

您可能犯了复制和粘贴错误,因为这两个实现是相同的;中的版本True似乎错误,它应该如下所示:

object True extends Boolean {
  def ifThenElse[T](t: => T, e: => T) = t   // t, not e
}

该类Boolean包含许多方法:&&||unary_!和它们都是根据 定义==的。!=ifThenElse

该方法ifThenElse采用两个按名称命名的参数,您可以看到它们,因为它们在参数列表中的类型是=> T。这意味着如果您在方法的实现中使用该名称,它将在该点进行评估。

于 2013-04-22T12:35:16.757 回答
5

所有需要的实现都包含在您的示例中。

Boolean是具有 2 个具体实现的抽象超类:TrueFalse

超类定义了对布尔值的通用操作,将不同的行为委托给子类之间唯一不同的特定操作:方法ifThenElse

子类被定义为objects,因此它们只有一个实例。

为了理解它们是如何工作的,让我们举个例子

/* 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

这只是一种使用名称调用来实现布尔运算的教育方法。正如您所看到的,每个调用只打印一个值,显示参数是“按需”评估的,而不是在调用站点评估的事实。

当然,这个符号使用起来相当麻烦,但它的目的是为了说明而不是实用,目的不是这样。

于 2013-04-22T14:08:16.643 回答