我正在阅读Odersky的书,下面是一个带有以下代码部分的speadsheet示例:
package org.stairwaybook.scells
trait Arithmetic { this: Evaluator =>
operations += (
"add" -> { case List(x, y) => x + y },
"sub" -> { case List(x, y) => x - y },
"div" -> { case List(x, y) => x / y },
"mul" -> { case List(x, y) => x * y },
"mod" -> { case List(x, y) => x % y },
"sum" -> { xs => (0.0 /: xs)(_ + _) },
"prod" -> { xs => (1.0 /: xs)(_ * _) }
)
}
“this:Evaluator”是指什么?有人可以帮助理解这个特性吗?我认为它定义了不同的功能操作,但我看不出大局......
答案 0 :(得分:11)
你在这看到什么
this:Evaluator =>
是特征的自我类型的用法。它基本上强制类将混合特征算术,以混合特质评估器。
如果您尝试创建如下所示的类:
class ArithmeticClass extends Arithmetic
如果您尝试执行此操作,则会出现编译时错误:
class ArithmeticClass extends Arithmetic with Evaluator
这是行得通的。如您所见,算术类修改了向操作添加内容,这可能是在Evaluator特征中定义的集合。
请注意,与简单继承相比,自我类型允许您设计更干净的类层次结构:
如果您使用自我类型,您可以考虑以下内容:
trait Evaluator { def runEvaluation : Int }
trait Arithmetic { self: Evaluator => def evaluate: Int = runEvaluation }
trait NullEvaluator extends Evaluator { def runEvaluation: Int = 0 }
class MyClass1 extends Arithmetic with Evaluator {... concrete methods .... }
class MyClass2 extends Arithmetic with NullEvaluator { ....concrete methods ..... }
所以自我类型让你表达与继承不同的东西。