2012-03-23 76 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>)