在这种情况下,字符串插值工作正常:
val name = "Bill"
val result = s"My Name is ${name}"
当我将它引入变量时,它没有得到插值:
val name = "Bill"
val greeting = "My Name is ${name}"
val result = s"${greeting}"
直接包装greeting
不是合适的解决方案,我必须像普通字符串一样处理问候语。
答案 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>