1am*_*bda 2 collections scala map
我在读斯卡拉学校.根据指南,Map可以包含像
def adder(x: Int, y:Int): Int = x + y
def add2(x:Int):Int = adder(2, x:Int)
val add3 = adder(3, _:Int)
val map = Map(
"adder" -> { adder(_, _) },
"add2" -> { add2(_) },
"add3" -> { add3(_) }
)
Run Code Online (Sandbox Code Playgroud)
好.上面的代码是编译的.但是如何调用地图中保存的功能?这些代码不起作用
map.get("adder")(2, 3) // compile error
val adderFunc: (Int, Int) => Int = map.get("adder") // compile error
Run Code Online (Sandbox Code Playgroud)
Scala编译器提供此错误消息
[error] /home/user/scalaExample/src/test/scala/CollectionBasicsTest.scala:61: Option[Object] does not take parameters
[error] map.get("adder")(2, 3) // compile error
[error] ^
[error] /home/user/scalaExample/src/test/scala/CollectionBasicsTest.scala:62: type mismatch;
[error] found : Option[Object]
[error] required: (Int, Int) => Int
[error] val adderFunc: (Int, Int) => Int = map.get("adder") // compile error
Run Code Online (Sandbox Code Playgroud)
这里有两个问题.一个是get返回Option.您可以使用它map("adder")来取回功能.
第二个也是最基本的问题是你在地图中放了两个完全不同的东西:一个带有两个参数的函数和一个带有一个参数的函数.这些类型完全不同,这意味着为地图的值推断的类型是AnyRef.所以,一旦你找回这样的对象,你就不能对它做任何事情,然后再回到某种有用的类型.
只保留地图中具有相同数量参数的函数,并使用第一个提示,事情就可以了.
| 归档时间: |
|
| 查看次数: |
188 次 |
| 最近记录: |