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

mez*_*ihn 30 string-interpolation kotlin

Kotlin编译器是否"Hello, $name!"使用类似的东西进行翻译

java.lang.String.format("Hello, %s!", name)
Run Code Online (Sandbox Code Playgroud)

还是有其他机制?

如果我有一个这样的类,例如:

class Client {
  val firstName: String
  val lastName: String
  val fullName: String
    get() = "$firstName $lastName"
}
Run Code Online (Sandbox Code Playgroud)

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

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

yol*_*ole 35

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

new StringBuilder().append("Hello, ").append(name).append("!").toString()
Run Code Online (Sandbox Code Playgroud)

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

  • @BugsHappen我知道我迟到了,但对于未来的读者:如果你需要一个比变量名更复杂的表达式,请使用大括号:`"$ {location.latitude},$ {location.longitude}"` (3认同)

Ari*_*aco 13

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

print("Your username is ${user.username}\n")
Run Code Online (Sandbox Code Playgroud)


vod*_*dan 12

关于你的第二个问题:如果你需要兑现fullName,你可以而且应该明确地做到:

class Client {
    val firstName: String
    val lastName: String
    val fullName = "$firstName $lastName"
}
Run Code Online (Sandbox Code Playgroud)

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


Ani*_*rya 8

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

var age = 21

println("My Age Is: $age")
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为这应该是公认的答案。仅供参考,如果您要插入“伴生对象”(即属性),它也需要用括号括起来。EX: `println("我的年龄是:${person.age}")` (2认同)