2012-07-18 164 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