2012-05-10 21 views
4

假設我有一個斯卡拉match表達Scala的模式匹配器執行多少優化?

foo match { 
    case Bar(Some(x)) => /* do something */ 
    case Bar(None) => /* do something else */ 
} 

多少優化該編譯器做的時候它編譯體現在哪裏?特別是,它是否會向Bar.unapply發出多個呼叫,或者是否只發出一個呼叫並匹配多次?

回答

6

您可以用很少的代碼檢查自己這樣的:

object Bar { 
    def unapply(x: Int): Option[Option[Int]] = { 
    println("Checking: " + x) 
    Some(None) 
    } 
} 

1 match { 
    case Bar(Some(x)) => println("do something") 
    case Bar(None) => println("do something else") 
} 

當你運行它,你就會得到:

Checking: 1 
do something else 

所以它看起來像斯卡拉沒有做多次調用Bar.unapply即使代碼看起來會有多個調用。從效率的角度來看,這很好,但是您應該避免在您的unapply方法中依賴於它們每次匹配語句被調用多次的副作用。

如果你擔心當優化情況,使之清楚的是,unapply纔會被調用一次的讀者,你可以很容易分裂的比賽:

1 match { 
    case Bar(y) => y match { 
    case Some(x) => println("do something") 
    case None => println("do something else") 
    } 
} 
+0

我認爲這個計劃是在2.10中對案例類進行改進 – llemieng