scala 字符串插值动态注入值

scala string interpolation inject value dynamically

我有两个字符串:

val s1: String = "aaa/$Y/$m/aaa_$Y$m$d" // this one has all three variables
val s2: String = "aaa/$Y/$m" // this one has only two variables

val myStrings: Seq[String] = Seq(s1, s2)

val myStringsUpdated: Seq[String] = myStrings.map(s => ???)

我可以将 Ymd 值动态注入 s1s2 以便获得 myStringsUpdated 序列吗?

字符串插值是在编译时完成的,因此它必须知道需要哪些变量以及它们将去往何处。但它只是一个 shorthand 用于连接静态 String 值和 toString 调用的结果,因此动态构建您想要的字符串应该相当简单。

如果您提供 conditions/transformations 的更多详细信息,那么可能会有一些干净的解决方案,例如使用 Option.

正如 Tim 已经提到的,插值是在编译时完成的,所以你不能直接使用它,但你可以做一个简单的技巧并将其包装到函数中:

//instead of plain interpolated string we've got function returning interpolated string
def s1(Y: String, m: String, d: String): String = s"aaa/$Y/$m/aaa_$Y$m$d" 
def s2(Y: String, m: String, d: String): String = s"aaa/$Y/$m" 

val myStrings: Seq[(String, String, String) => String] = Seq(s1, s2)

//you inject value by just applying function
val myStringsUpdated = myStrings.map(_.apply("1999", "11", "01"))

println(myStringsUpdated) //List(aaa/1999/11/aaa_19991101, aaa/1999/11)