Kotlin 中的字符串插值是如何工作的?
How does string interpolation work in Kotlin?
Kotlin 编译器是否使用类似
的方式翻译"Hello, $name!"
java.lang.String.format("Hello, %s!", name)
还是有其他机制?
如果我有这样的 class 例如:
class Client {
val firstName: String
val lastName: String
val fullName: String
get() = "$firstName $lastName"
}
这个 getter return 是一个缓存的字符串还是会尝试构建一个新的字符串?我应该改用 lazyOf 委托吗?
我知道除非有数百万次调用 fullName
,否则不会有性能问题,但除了如何使用它之外,我还没有找到关于此功能的文档。
Kotlin 编译器将这段代码翻译成:
new StringBuilder().append("Hello, ").append(name).append("!").toString()
不执行缓存:每次计算包含字符串模板的表达式时,都会重新构建生成的字符串。
关于你的第二个问题:
如果您需要为 fullName
缓存,您可以而且应该明确地这样做:
class Client {
val firstName: String
val lastName: String
val fullName = "$firstName $lastName"
}
此代码等同于您的代码片段,只是基础 getter getFullName()
现在使用带有串联结果的最终私有字段。
如您所知,在字符串插值中,对包含占位符的字符串文字进行求值,生成占位符被替换为相应值的结果。
所以插值(在 KOTLIN 中)是这样的:
var age = 21
println("My Age Is: $age")
记住:“$”符号用于插值。
你可以这样做:
String.format("%s %s", client.firstName, client.lastName)
始终使用花括号以避免意外。例如,如果您要对对象 属性 进行字符串插值,则应将其括在大括号中:
print("Your username is ${user.username}\n")
Kotlin 编译器是否使用类似
的方式翻译"Hello, $name!"
java.lang.String.format("Hello, %s!", name)
还是有其他机制?
如果我有这样的 class 例如:
class Client {
val firstName: String
val lastName: String
val fullName: String
get() = "$firstName $lastName"
}
这个 getter return 是一个缓存的字符串还是会尝试构建一个新的字符串?我应该改用 lazyOf 委托吗?
我知道除非有数百万次调用 fullName
,否则不会有性能问题,但除了如何使用它之外,我还没有找到关于此功能的文档。
Kotlin 编译器将这段代码翻译成:
new StringBuilder().append("Hello, ").append(name).append("!").toString()
不执行缓存:每次计算包含字符串模板的表达式时,都会重新构建生成的字符串。
关于你的第二个问题:
如果您需要为 fullName
缓存,您可以而且应该明确地这样做:
class Client {
val firstName: String
val lastName: String
val fullName = "$firstName $lastName"
}
此代码等同于您的代码片段,只是基础 getter getFullName()
现在使用带有串联结果的最终私有字段。
如您所知,在字符串插值中,对包含占位符的字符串文字进行求值,生成占位符被替换为相应值的结果。 所以插值(在 KOTLIN 中)是这样的:
var age = 21
println("My Age Is: $age")
记住:“$”符号用于插值。
你可以这样做:
String.format("%s %s", client.firstName, client.lastName)
始终使用花括号以避免意外。例如,如果您要对对象 属性 进行字符串插值,则应将其括在大括号中:
print("Your username is ${user.username}\n")