3

我正在阅读 Odersky 的书,并且有一个带有以下代码部分的电子表格示例:

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

“这个:评估者”指的是什么?有人可以帮助理解这个特征吗?正如我所看到的,它定义了不同的操作,这些操作是函数,但我看不到大图......

4

1 回答 1

11

你在这里看到的

this:Evaluator =>

是自我类型对特征的使用。它基本上强制将混合 trait Arithmetic 的类也混合 trait Evaluator。

如果您尝试创建如下类:

class ArithmeticClass extends Arithmetic

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

class ArithmeticClass extends Arithmetic with Evaluator

这将起作用。正如你所看到的,Arithmetic 类修改了一些操作,这可能是在 Evaluator trait 中定义的一个集合。

请注意,与简单继承相比,自类型可以让您设计更清晰的类层次结构:

如果您使用 self 类型,您可以考虑以下内容:

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 ..... }

所以 self 类型可以让你表达一些不同于继承的东西。

于 2012-07-18T06:53:22.887 回答