2012-03-26 38 views
1

我正在構建枚舉條目映射到對象中的簡單數據訪問器。下面是使用詮釋作爲密鑰的示例(從解釋器):地圖容器中函數的緊湊表示法?

class Obj(a: Int, b: Int) { 
    def getA = a 
    def getB = b 
} 

val m : Map[Int, (Obj) => Int] = Map(
    (2, (o: Obj) => o.getA) 
); 

val d = m(2)(new Obj(3,4)) 

這工作得很好,但不必編寫與所述的函數:OBJ在每個映射值的參數explicitally鍵入似乎不必要:

(o: Obj) => o.getA 

我錯過了更緊的語法嗎?

回答

6

在這種情況下,類型將被推斷,例如:

scala> val m : Map[Int, (Obj) => Int] = Map(
    |  (2, _.getA) 
    |) 
m: Map[Int,Obj => Int] = Map(2 -> <function1>) 

scala> m(2)(new Obj(3,4)) 
res0: Int = 3 

在這裏,我用下劃線進行功能定義簡潔越好,但你也可以定義功能:o => o.getA。如果參數不止一次使用,那麼它會很有用,例如:o => o.getA + o.getB

+0

謝謝。我將使用它並發表評論,以便下一個Java編程也可以理解它:) – flend 2012-03-26 13:07:12

3

如果你想獲得在左側擺脫類型標註的(並不總是一個好主意,但好於簡潔)就可以了,保持你原有的右手邊,或稍短:

val m = Map((2, (_: Obj).getA)) 

順便說一句,在斯卡拉這將是更地道來定義類作爲

class Obj(val a: Int, val b: Int) 
// or 
case class Obj(a: Int, b: Int) 

,並請參閱您的領域簡單地ab,因爲編譯器爲您提供了干將。