2013-05-22 21 views
5

我使用下面的代碼來滿足我的需求:斯卡拉未綁定的佔位符參數

(1 to 5)..map(i => s"\\x${i}") // Produces List("\\x1", "\\x2", "\\x3", "\\x4", "\\x5") 

但我想用一個佔位符。據the string interpolator documentation

(1 to 5).map(s"\\x${_}") 

應擴展爲:

(1 to 5).map(StringContext("\\\\x","").s(_)) 

但後者的作品,而不是前者,這將引發對_error: unbound placeholder parameter。爲什麼?

回答

10

我相信的語法:

(1 to 5).map(s"\\x${_}") 

編譯器認爲,_屬於s功能在這種情況下將無法正常工作。您可以輕鬆地做這樣的事情解決這個問題:

(1 to 5).map(i => s"\\x${i}") 

你可能想看看這個link用於對相對於匿名函數的佔位符規則進一步明晰。

編輯: 根據這個帖子,曾經工作過的佔位符語法,所以也許這是一個迴歸錯誤,或者從來就不是這樣的工作方式一個特點:https://groups.google.com/forum/#!msg/scala-internals/G_54LGj0zpg/REZfyXZ6-RwJ

+0

我補充說,我已經解決直接在我的問題中使用。如果可能的話,我想要超越信仰。 's'不是一個函數,它是一個scala特性。 –

+1

@MikaëlMayer好吧,不,它不是一種語言功能。它的定義如下:http://www.scala-lang.org/api/current/#scala.StringContext 你也可以使用raw「」,f「」甚至創建你自己的字符串插值器(json「」,sql 「」 ......) – VasyaNovikov