字符串插值如何在Kotlin中起作用?

时间:2016-05-25 15:53:31

标签: kotlin string-interpolation

Kotlin编译器是否使用类似

的内容翻译"Hello, $name!"
java.lang.String.format("Hello, %s!", name)

还是有其他机制吗?

如果我有这样的课程,例如:

class Client {
  val firstName: String
  val lastName: String
  val fullName: String
    get() = "$firstName $lastName"
}

这个getter会返回一个缓存的字符串还是会尝试构建一个新的字符串?我应该使用lazyOf委托吗?

我知道除非会有数百万次调用fullName,否则不存在性能问题,但除了如何使用该功能外,我还没有找到有关此功能的文档。

5 个答案:

答案 0 :(得分:31)

Kotlin编译器将此代码转换为:

new StringBuilder().append("Hello, ").append(name).append("!").toString()

没有执行缓存:每次评估包含字符串模板的表达式时,将再次构建生成的字符串。

答案 1 :(得分:11)

关于你的第二个问题: 如果您需要兑现fullName,您可以并且应该明确地执行此操作:

class Client {
    val firstName: String
    val lastName: String
    val fullName = "$firstName $lastName"
}

此代码等同于您的剪切,但底层getter getFullName()现在使用最终私有字段并连接结果。

答案 2 :(得分:4)

如您所知,在字符串插值中,将评估包含占位符的字符串文字,从而产生一个结果,其中占位符将替换为其对应的值。 所以插值(在KOTLIN中)是这样的:

var age = 21

println("My Age Is: $age")

请记住:“$”符号用于插值。

答案 3 :(得分:3)

始终使用大括号以避免意外。例如,如果您要对对象属性进行字符串插值,则应将其括在大括号中:

print("Your username is ${user.username}\n")

答案 4 :(得分:0)

你可以这样做:

String.format("%s %s", client.firstName, client.lastName)