使用转义引号,然后在内插字符串中使用大括号

Using an escaped quote and then braces in interpolated string

我正在编写一个(内插)字符串,它具有普遍理解的 {thing} 部分,用户应该将其理解为预期输入的占位符。由于没有前导 $,我认为花括号会按字面解释。

第一次尝试:花括号

val name = "Michael"
println(s"Hi, $name! Please enter your birthday in the form \"{month} {day}\".")

IntelliJ IDEA 让我没有理由担心。看起来像一个普通的旧字符串:

但是我收到一个错误:

not found: value month

第二次尝试:方括号

好吧,大括号不是个好主意。方括号呢?

val name = "Michael"
println(s"Hi, $name! Please enter your birthday in the form \"[month] [day]\".")

同样,IDEA 的格式让我期望大括号将按字面解释。

但是我收到一个不同的错误:

not found: type month

第三次尝试:删除转义引号

现在我正在抓救命稻草。我会删除转义引号。

val name = "Michael"
println(s"Hi, $name! Please enter your birthday in the form {month} {day}.")
println(s"Hi, $name! Please enter your birthday in the form [month] [day].")

有效!格式不完全符合我的要求,但足以说明问题。

所以,我的问题:为什么?为什么转义双引号会对这些字符串的解释(和编译)产生任何影响?

显然这不会破坏我的编码,但它令人费解且违反直觉(对我而言)。我很想了解幕后发生的事情。

这是 scala 中的一个错误 - escape does not work with string interpolation

与牙套无关。 scala 认为,该字符串在第一个转义引号之后结束并且找不到以下 month