Scala特质语法

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

“this:Evaluator”是指什么?有人能帮助理解这种特性吗?就我所见,它定义了不同的操作,它们是函数,但我看不到整个大局...

1个回答

12

你在这里看到的内容

this:Evaluator =>

self-type在trait中的使用,基本上是强制要求混入trait Arithmetic的类也混入trait 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 ..... }

因此,自类型允许您表达与继承不同的东西。


4
当然,这全部都是正确的,但通常人们不会直接混合使用 Evaluator(因为在这种情况下,Arithmetic 可以直接扩展 Evaluator),而是 Evaluator 的子类型。 - Kim Stebel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接