Kotlin 的多行字符串处理在很多方面都非常出色,并且它的 .trimIndent()
功能允许您保持字符串文字与其余代码的缩进,如下所示:
fun main(args: Array<String>) {
val myString = """
hello
world
""".trimIndent()
println(myString)
将打印出:
hello
world
代码中没有文字缩进。但是,如果插入的值是多行,那么使用 Kotlin 强大的字符串模板系统时就会出现问题:
fun main(args: Array<String>) {
val myString = """
hello
world
""".trimIndent()
println("""
teststring2
$myString
""".trimIndent())
}
将打印出来
teststring2
hello
world
出现这种情况是因为 world
位于新行,并且没有收到 hello
所获得的缩进。有没有一种优雅的方式来处理这个问题?
最佳答案
这是第一个字符串文字。 (为了避免混淆,我将使用下划线来表示空格。)
____hello
____world
它的 trimIndent()
调用将删除空格,使其不缩进,如下所示:
hello
world
第二个字符串如下所示:
________teststring2
________$myString
然后 $myString
将被精确替换为第一个的内容:
________teststring2
________hello
world
请注意,$myString
之前的缩进仍然存在,为您在“hello”之前看到的空格提供了空间;但 myString
中没有缩进,因此您在“world”之前看不到任何缩进。
现在,trimIndent()
删除“所有输入行的共同最小缩进”。但由于最后一行的原因,这里没有常见的缩进。因此第二个 trimIndent()
调用什么也不做。
至于做什么,可能有几种选择。如果您不需要任何缩进,那么最明显的方法是删除所有缩进,而不仅仅是常见的缩进。 (我认为标准库中没有专用函数,但编写一个函数应该很容易。例如,您可以使用正则表达式将 "^ *"
替换为 “”
。)
关于Kotlin 字符串连接 - 保留多行字符串的缩进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65294629/