为了完整起见,这里还有一些在 Kotlin 代码中动态评估字符串模板的方法。
字符串模板的正常行为是在编译时评估字符串的内容。在你的代码执行期间它不会改变:
fun main() {
var subject = "world"
val hello = "hello $subject"
subject = "stackoverflow"
println(hello)
}
// Output: hello world
此限制有多种解决方法:
Lambda 函数
您可以将 String 包装在 lambda 函数中,因此每次调用函数时,它都会评估 String 的新实例。
fun main() {
var subject = "world"
val hello = {"hello $subject"}
subject = "stackoverflow"
println(hello())
}
// Output: hello stackoverflow
优势
缺点
匿名对象
您可以创建匿名对象(类似于 Java 中的静态)并覆盖 toString 方法。
fun main() {
var subject = "world"
val hello = object { override fun toString() = "hello $subject"}
subject = "stackoverflow"
println(hello())
}
// Output: hello stackoverflow
注意:我不推荐这种方法。
优势
缺点
财产委托
您可以将属性运算符函数委托给外部类,以实现字符串模板的动态评估。
import kotlin.reflect.KProperty
fun main() {
var subject = "world"
val hello: String by dynamicStringTemplate { "hello $subject" }
subject = "stackoverflow"
println(hello)
}
// Output: hello stackoverflow
class dynamicStringTemplate(var value: () -> String) {
operator fun getValue(thisRef: Nothing?, prop: KProperty<*>): String {
return this.value()
}
operator fun setValue(thisRef: Nothing?, prop: KProperty<*>, value: String) {
this.value = {value}
}
}
优势
缺点