Scala中的字符串插值?

时间:2011-10-27 14:29:39

标签: scala string-interpolation

我想询问Scala中是否存在任何类型的字符串插值。我已经对这个主题进行了搜索,但是到现在为止我发现没有字符串插值。是否有计划在下一版本中实施?

谢谢!

更新

字符串插值将在scala 2.10中,你可以试用,因为scala 2.10.RC1已经用完了(20/10/2012)。您可以查看此SIP以获取scala 2.11,其中指出模式匹配器中的插值字符串将是有效语法。使用新的字符串插值,您可以执行以下操作:

val age = 28
val name = "Gerry"

s"My name is $name and I am $age years old"
res0: String = My name is Gerry and I am 28 years old

但是在目前可用的所有内插器上试用documentation。请注意,您可以定义自己的插补器!请尝试this link了解详情。

5 个答案:

答案 0 :(得分:22)

它不在(已发布的)scala库中。但是有一个SIP(Scala改进流程)用于添加此功能:

http://docs.scala-lang.org/sips/pending/string-interpolation.html

答案 1 :(得分:14)

你可以做C风格:

"Interpolate my %s here" format List(1,2,3)

//String = Interpolate my List(1, 2, 3) here

List(1,2,3) formatted "Interpolate my %s here"

你可以在任何带有toString(即任何东西)

的东西上使用它们
case class Foo(n: Int)
Foo(42) formatted "Here is a %s !!!!"
//String = Here is a Foo(42) !!!!

虽然前者在单个字符串中启用多个插值方面更灵活(因为它可以采用多个参数)。

答案 2 :(得分:7)

我在scala 2.9上使用xml hack

val age = 28
val name = "Gerry"

<a>My name is {name} and I am {age} years old</a>.text
res0: String = My name is Gerry and I am 28 years old

答案 3 :(得分:1)

是的,通过编译器插件在当前的scala版本中有字符串插值 见http://jrudolph.github.com/scala-enhanced-strings

答案 4 :(得分:0)

这一天(2016年12月,Scala 2.12,五年后),您可以编写自己的字符串插值 见co.ntextu.al

  

Contextual是一个小型Scala库,它允许您定义自己的字符串插值器 - 前缀字符串文字,如uri"https://google.com",它们确定如何在运行时和编译时评估它们,同时只编写非常普通的用户代码:没有宏!

例如,contextual/examples/email.scala允许check at compile time the validity of an email address

import contextual.examples.email._
email"""info@scala.world"""

import contextual.examples.email._
email"""john.smith@hotmail.com"""