2013-05-22 23 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