2015-10-19 17 views
2

我發現在Scala編譯器警告對象幾個問題:如何真正解決這個後綴行動問題

postfix operator xxx should be enabled by making the implicit value scala.language.postfixOps visible. This can be achieved by adding the import clause 'import scala.language.postfixOps' or by setting the compiler option -language:postfixOps. See the Scala docs for value scala.language.postfixOps for a discussion why the feature should be explicitly enabled.

這裏給出了這樣的警告顯示了一個例子:

val m1 = List(1->"a",2->"b") toMap 

無當我第一次遇到這個問題時,真的回答了我想知道的內容:如何解決這個問題沒有涉及導入或編譯器選項。我的第一個想法是:如果它不喜歡postfix操作,那麼通過用點替換空格,使方法/ op調用顯式。例如:

val m1 = List(1->"a",2->"b").toMap 

不幸的是,當我第一次嘗試的修復,那我正好在當時是工作的代碼看起來是這樣的:

val m2 = List(1->"a",2->"b") map {case (k,v) => (k.toString,v)} toMap 

當我加了點,這導致了另一個不起眼的編譯器錯誤:

val m2 = List(1->"a",2->"b") map {case (k,v) => (k.toString,v)}.toMap 

missing parameter type for expanded function The argument types of an anonymous function must be fully known. (SLS 8.5) Expected type was: ?

這關係到kv標識符。

那時候,我剛剛放棄並添加了導入語句,一切都很順利。然而,最近一位學生問我這個問題,我想我最好回去調查一下。看到我對這個問題的回答,現在我認爲這個問題很明顯。但是我希望能夠挽救一些其他人花時間去研究這個問題的所有其他討論。

回答

3

我通常在這種情況下做的,我會加點第一個電話:

val m2 = List(1->"a",2->"b").map {case (k,v) => (k.toString,v)}.toMap 

就個人而言,我更喜歡這個有額外的括號。

+0

確實,這也可以。也許它稍微更優雅。 – Phasmid

1

答案與操作符的關聯性有關(「。」比地圖綁定更緊密)。答案當然是覆蓋帶括號的結合:

val m2 = (List(1->"a",2->"b") map {case (k,v) => (k.toString,v)}).toMap