2013-04-22 66 views
3

观看讲座4.2马丁·奥德斯基的斯卡拉当然,我不明白下面的类,或者它的用途:解释一个scala类和对象?

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 
    } 

} 

可来样implentations /解释是提供这样我就可以更好地提供什么正在发生和/或它的使用?

回答

5

所有需要的实现都包含在你的例子中。

Boolean是一个抽象的超类与2个的具体实现: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-名实现布尔运算。正如您所看到的,每次调用都会打印一个值,显示参数是“按需”评估的,而不是在呼叫站点。

当然,这个符号使用起来相当麻烦,但它的意义在于说明性而不实际,目标不是这样。

+0

谢谢,((!False)怎么叫方法'unary_!' ,是'!'和'unary_!'没有不同的方法签名? – 2013-04-22 14:42:27

+2

@ user470184'unary_'是一种语言功能。请参阅Scala的语言规范或书籍,例如http://www.artima.com/pins1ed/basic-types-and-operations.html#5.3 – 2013-04-22 16:41:31

4

你对班级有什么不了解?

它定义了一个抽象类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。这意味着如果你在方法的实现中使用这个名字,它将在那个时候被评估。

相关问题