2012-07-18 105 views
3

我读Odersky的书并没有与follwowing代码部分电子表格中以后例如:斯卡拉特质语法

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)(_ * _) } 
    ) 
    } 

是什么“这样的:评估者”是指什么?有人可以帮助理解这个特点吗?当我看到它定义它们是功能不同的操作,但我没有看到大局...

回答

10

你在这里看到的

this:Evaluator => 

是自我型的特征使用。它基本上强迫要混合特质算术的类,也混合特质评估者。

如果试图创建一个类,如以下几点:

class ArithmeticClass extends Arithmetic 

,你会得到一个编译时错误,而如果你尝试这样做:

class ArithmeticClass extends Arithmetic with Evaluator 

这是怎么回事工作。正如你所看到的,Arithmetic类修改了一些操作,这可能是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 ..... } 

所以自我类型让你表达与继承不同的东西。

+3

这当然都是正确的,但通常不会直接在'Evaluator'中混合(因为在这种情况下,'Arithmetic'可能只是扩展'Evaluator'),而不是'Evaluator'的子类型。 – 2012-07-18 07:25:35