2011-07-27 40 views
1

電梯使用其執行彗星演員的PartialFunction,你通常這樣結束了對你的類:部分功能模式匹配分成類和特質

override def lowPriority: PartialFunction[Any,Unit] = { 
    case MyCaseClass1(a)  => do something here 
    case MyCaseClass2(a)  => do something here 
    case AlwaysPresentCaseClass => default action 
} 

我想怎麼辦,而且我不確定是否有可能將該部分功能拆分,以便將最後一種情況轉移到特徵中。

所以當我有一個新的彗星演員,我只是做:

class MyNewComet extends MyActorTrait { 
    override def lowPriority: PartialFunction[Any,Unit] = { 
    case MyCaseClass1(a)  => do something here 
    case MyCaseClass2(a)  => do something here 
    } 
} 

,不知何故性狀MyActorTrait將有丟失

case AlwaysPresentCaseClass => default action 

回答

0

試試這個:

trait MyActorTrait extends /* whatever class provides lowPriority */ { 
    def default: PartialFunction[Any, Unit] = { 
      case AlwaysPresentCaseClass => default action 
    } 

    abstract override def lowPriority: PartialFunction[Any,Unit] = 
     super.lowPriority orElse default 
} 

唯一的問題是,你不能這樣做MyNewComet extends MyActorTrait。相反,您可以有class MyNewCometDefault extends MyNewComet with MyActorTraitnew MyNewComet with MyActorTrait

+0

謝謝你的答案。我選擇了這個,因爲@丹尼爾多走了一步,添加了實際的特徵代碼和解釋。對於任何感興趣的人,最終的提升相關代碼是[here](http://groups.google.com/group/liftweb/browse_thread/thread/5ebe68f806beab0e) – fmpwizard

9

您可以撰寫使用orElse方法部分功能:

val f1: PartialFunction[Any, String] = { 
    case 22 => "hallo" 
} 
val f2: PartialFunction[Any, String] = { 
    case "rara" => "welt" 
} 

val f = f1 orElse f2 // f falls back to f2 if undefined in f1 
f(22) 
f("rara")