scala字符串插值动态注入值



我有两个字符串:

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序列吗?

正如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)

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

如果您提供条件/转换的更多细节,那么可能有一些干净的解决方案,例如使用Option

最新更新