15

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

谢谢!

更新

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

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

但是尝试一下目前可用的所有插值器的文档。请注意,您可以定义自己的插值器!试试这个链接了解更多信息。

4

5 回答 5

22

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

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

于 2011-10-27T14:31:40.933 回答
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) !!!!

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

于 2011-10-27T14:49:16.777 回答
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
于 2012-11-18T12:36:14.810 回答
1

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

于 2011-11-01T20:42:24.517 回答
0

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

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

例如,contextual/examples/email.scala允许在编译时检查电子邮件地址的有效性

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

import contextual.examples.email._
email"""john.smith@hotmail.com"""
于 2016-12-25T22:28:34.760 回答