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 => ???)
我可以将 Y
、m
、d
值动态注入 s1
、s2
以便获得 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)
我有两个字符串:
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 => ???)
我可以将 Y
、m
、d
值动态注入 s1
、s2
以便获得 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)