2010-10-12 32 views
0

我看到下面的代碼:如何限制匿名函數的邊界?

Map(1 -> "one", 2 -> "two") map _._1 

這個返回可迭代[INT],但如果我什麼都不做地圖,怎麼辦呢?

我想要做類似下面,但是下面的代碼無法編譯,我知道,因爲它的對象實例而不是功能,而是如何建立一個函數來做到x => x和使用佔位符:

Map(1 -> "one") map (_) // map (Int, String) to (Int, String) by nothing change 
// I test some other way, but all can't compile 

如何做到這一點?

修訂

對不起,混淆激情的人。我想知道爲什麼map (_) != map (x => x),編譯器轉換這個代碼(x$1) => Map(1.$minus$greater("one")).map(x$1)爲什麼不Map('a'.$minus$greater(1)).map((x$1) => x$1),並確實存在有一個方法可以使用_使此代碼?

我用下面的代碼,以幫助編譯器推斷出_類型:

Map(1 -> "one") map (_:((Int, String))=>(Int, String)) 
// but it return (((Int, String)) => (Int, String)) => scala.collection.immutable.Map[Int,String] = <function1> 

這似乎解析器不知道放在哪裏匿名函數的開始。所以我的新問題是「如何幫助解析器限制匿名函數的邊界?」

+0

爲什麼你需要做到這一點使用'map'? 'Map(1 - >「one」,2 - >「two」).Iterable'不足夠嗎? – 2010-10-12 10:19:55

+0

對不起迷惑你,這只是在我的頭上,而不是一個真正的問題的問題。沒有理由這樣做,只想知道如何。 – 2010-10-12 12:42:57

回答

2

不知道我理解的問題,但identity也許是你在找什麼:

scala> Map(1 -> "one") map (identity) 
res66: scala.collection.mutable.Map[Int,java.lang.String] = Map((1,one)) 

,或者做一些技巧:

scala> def __[A](x: A): A = x 
__: [A](x: A)A 

scala> Map(1 -> "one") map (__) 
res1: scala.collection.immutable.Map[Int,java.lang.String] = Map((1,one)) 
+0

:-)只是想想這樣的功能 – walla 2010-10-12 10:37:15

+0

沒錯,這就是我想要的。使用scala內部方法來做到這一點。但是有沒有其他方式使用佔位符來處理?這個問題僅僅來自我想知道爲什麼'_!= x => x'的瘋狂想法,爲什麼_不能代表'Predef.identity'這樣的函數。這不是一個真正的問題。 – 2010-10-12 12:38:08

0
 

    Map(1 -> "one") map((x)=>x) 
 
+0

對不起,我知道可以做,但我想用佔位符語法來做到這一點。 – 2010-10-12 10:11:19

1

我看不到你在這裏試圖做的任何價值,將集合映射到自身的正確方法不是調用map!

錯誤:

Map(1 -> "one") map (_) 

右:

Map(1 -> "one") 

這是不是作爲一個淺拷貝操作,即使有用,默認斯卡拉地圖是不可改變的,有沒有點複製它。

+0

抱歉讓你迷惑,就像我上面的評論一樣,這只是我腦海中的一個問題,不是一個真正的問題。 – 2010-10-12 12:41:09