2013-06-25 66 views
2

好的,這不是關於vals或函數和方法之間根本區別的另一個問題。我看到,在這個編譯:val和無參數def之間的細微差別

val Extractor = new AnyRef { def unapply(s :String) => Some(s) } 
val x = "hello" match { case Extractor(s) => s } 

改變val Extractordef Extractor斷碼。爲什麼這樣?這有點令人失望,因爲我希望完整的透明性能夠讓我從vals(生成方法)變爲defs,反之亦然。我想知道還有什麼可以用一個而不是另一個來完成?

回答

4

我不確定我可以提供詳盡的清單,但我可以在這種情況下解釋發生了什麼。

Extractor必須是一個穩定的標識符。請參閱Scala Language Specification的第8.1.8節。 (A def不穩定; val是。)

穩定標識符具有某些很好的屬性,可以使它們更簡單地計算並具有更大的優化可能性。

+1

我敢打賭,雷克斯可能是徹底的,或者至少耗盡,但這讓我有幾次進口。 –