私は Scala の初心者で、以下に質問があります。
def test() {
var mapObj = Map(1->'a',"Add"->((x:Int,y:Int)=>(x+y)))
mapObj("Add")
}
test()
パラメータ x:1 と y:2 を指定してメソッド「Add」を呼び出し、結果 3 を取得するにはどうすればよいですか?
あなたの親切な助けに感謝し、感謝します。あなたの答えを待っています^_^
私は Scala の初心者で、以下に質問があります。
def test() {
var mapObj = Map(1->'a',"Add"->((x:Int,y:Int)=>(x+y)))
mapObj("Add")
}
test()
パラメータ x:1 と y:2 を指定してメソッド「Add」を呼び出し、結果 3 を取得するにはどうすればよいですか?
あなたの親切な助けに感謝し、感謝します。あなたの答えを待っています^_^
キーと値のペアがなければ、1 -> 'a'
これは簡単です。
scala> var mapObj = Map("Add"->((x:Int,y:Int)=>(x+y)))
mapObj: scala.collection.immutable.Map[String,(Int, Int) => Int] = Map(Add -> <function2>)
scala> mapObj.get("Add").get.apply(1,2)
res0: Int = 3
キーと値に異なる型がInt
ありString
、キーとChar
値Function2
に型推論器が使用する最も一般的なスーパー型であるAny
. 次に、扱いMap[Any, Any]
にくいタイプを取得します。
キーが同じタイプになり、値が同じタイプになるようにしてください。型推論器が残りを行い、上記のコードを使用できます。
問題はあなたmapObj
がタイプMap[Any,Any]
であるためmapObj("Add")
、タイプの要素を返すことですAny
(実際にはFunction2です)。したがって、コンパイラはそれを関数として使用できません。これを Function2 に変換してから使用する必要があります。
scala> val mapObj = Map(1->'a',"Add"->((x:Int,y:Int)=>(x+y)))
mapObj: scala.collection.immutable.Map[Any,Any] = Map(1 -> a, Add -> <function2>
)
scala> mapObj("Add")
res8: Any = <function2>
scala> mapObj("Add").asInstanceOf[scala.Function2[Int,Int,Int]](1,2)
res9: Int = 3
これをすべて回避するには、マップから除外1->'a'
し、マップをタイプとして使用することをお勧めしますMap[Int, Function]