Scala字符串插值与下划线

3
我刚开始学习Scala,如果您能指向相关文档就更好了,但是在我的研究中没有找到这个问题的答案。
我正在使用scala 2.11.8和Spark2.2,并尝试使用插值创建一个包含dateString1_dateString2(带下划线)的动态字符串,但遇到了一些问题。
val startDt = "20180405" 
val endDt = "20180505"

这似乎有效:

s"$startDt$endDt"
res62: String = 2018040520180505

但是这个失败了:
s"$startDt_$endDt"
<console>:27: error: not found: value startDt_
       s"$startDt_$endDt"
          ^

我原以为这个简单的转义方法可以奏效,但实际上并没有得到预期的结果:
s"$startDt\\_$endDt"
res2: String = 20180405\_20180505

请注意,这个问题与 为什么不能在字符串插值中使用下划线? 不同,因为这个问题正在寻找可行的字符串插值解决方案,而前一个问题则更加关注Scala内部机制。

1
可能是为什么不能在字符串插值中使用_?的重复问题。 - Raman Mishra
你尝试过使用原始插值吗? - Raman Mishra
4
"s"${startDt}${endDt}" 的翻译是: "s"${开始日期}${结束日期}" - Leo C
1
@RamanMishra我不认为这是那个问题的重复。那个问题是关于使用_匿名占位符参数。这是关于在一个$变量的末尾加上_并查找另一个变量的问题。 - Andy Hayden
1个回答

8

您可以使用花括号明确指定:

@ s"${startDt}_${endDt}"
res11: String = "20180405_20180505"

你的代码:
s"$startDt_$endDt"

由于startDt_是一个有效的标识符,所以程序运行失败,Scala会尝试插入这个不存在的变量。


是的,这段代码可以编译通过,但并不能产生所需的结果:val startDt_ = "20180405" val endDt = "20180505" s"$startDt_$endDt" res13: String = 2018040520180505 - user9074332
@user9074332 是的,因为在这种情况下,_是变量名的一部分,但你想要字符串中的字面_字符。 - puhlen
@user9074332 我的意思是“这就是错误的意思”(它在查找变量 startDt_)。 :) - Andy Hayden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接