2012-03-23 52 views
4

Twitter's Scala schoolcollections section,他们表现出了部分功能的值地图:斯卡拉地图的部分功能价值

// timesTwo() was defined earlier. 
def timesTwo(i: Int): Int = i * 2 
Map("timesTwo" -> timesTwo(_)) 

如果我尝试使用Scala 2.9.1和sbt我得到这个编译如下:

[error] ... missing parameter type for expanded function ((x$1) => "timesTwo".$minus$greater(timesTwo(x$1))) 
[error]  Map("timesTwo" -> timesTwo(_)) 
[error]        ^
[error] one error found 

如果我添加的参数类型:

Map("timesTwo" -> timesTwo(_: Int)) 

然后我得到以下编译器错误:

[error] ... type mismatch; 
[error] found : Int => (java.lang.String, Int) 
[error] required: (?, ?) 
[error]  Map("timesTwo" -> timesTwo(_: Int)) 
[error]     ^
[error] one error found 

我很难过。我错过了什么?

回答

5

它认为你想这样做:

Map((x: Int) => "timesTwo".->timesTwo(x)) 

当你想这样的:

Map("timesTwo" -> { (x: Int) => timesTwo(x) }) 

所以此工程:

Map(("timesTwo", timesTwo(_))) 
Map("timesTwo" -> { timesTwo(_) }) 

注意,这不是一个平常的错误,见

(甚至更多)

+3

或'地图( “timesTwo” - >(timesTwo _))' – 2012-03-23 05:41:23

+0

或'地图[字符串,INT => INT]( “timesTwo” - > timesTwo) ' – sschaef 2012-03-23 13:33:19

2

你缺少告诉scalac电梯方法timesTwo功能。这可以用下划线如下进行

scala> Map("timesTwo" -> timesTwo _) 
res0: scala.collection.immutable.Map[java.lang.String,Int => Int] = Map(timesTwo -> <function1>)