2012-03-26 8 views
1

オブジェクト内の単純なデータアクセサへの列挙エントリのマップを作成しています。ここでの例では、キーとしてのIntを使用して(通訳から)です:マップコンテナの関数のコンパクト表記法ですか?

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

3

あなたは左側の型注釈を取り除きたい場合は(常にではない良いアイデアが、簡潔のために良い)することができます、あなたのオリジナルの右側を維持、またはわずかに短い:

val m = Map((2, (_: Obj).getA)) 
さておき、コンパイラはゲッターを提供しますので、

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

として、あなたのクラスを定義し、単にabとしてあなたフィールドを参照して、より慣用的だろうScalaでのよう

関連する問題