Scala从变量插入String

时间:2018-06-02 08:47:23

标签: scala string-interpolation

在这种情况下,字符串插值工作正常:

val name = "Bill"
val result = s"My Name is ${name}"

当我将它引入变量时,它没有得到插值:

val name = "Bill"
val greeting = "My Name is ${name}"
val result = s"${greeting}"

直接包装greeting不是合适的解决方案,我必须像普通字符串一样处理问候语。

2 个答案:

答案 0 :(得分:0)

Scala中的字符串插值不会以您期望的方式构成。

has been debated的问题。人们想要它,但人们并不总能得到他们想要的东西。

你可以想象编写一些协同工作的宏。一个定义了一个带字符串的函数,另一个知道如何通过在范围内使用正确命名的值调用它来插入它。

另外值得补充的是,插值不是通用的运行时模板机制。例如,您无法从"$greeting"形式的文件中读取字符串并在其上运行插值替换。

答案 1 :(得分:0)

  • 有一个值为name的未使用变量"Bill"
  • 有一个String变量greeting,其中包含字符['M','y',' ','n','a','m','e',' ','i','s',' ','$','{','n','a','m','e','}'](与变量name完全无关,四个字符'n',{{1} },'a''m'不可能接近编译器的符号表,这很好。)
  • 有一个变量'e',其值是通过result中的字符串插值来计算的。自

    greeting

    必须始终导致变量val y = "whatever" val x = s"${y}" 与变量x具有相同的内容,变量y最终具有与result相同的值,即{{1} }。

如果编译器尝试执行每个看起来像Scala代码的子字符串,则将导致混乱,因为每次某些东西可能从greeting数据领域泄漏到可执行代码领域时,它都会使代码容易受到各种注入漏洞的攻击。<​​/ p>