【问题标题】:Kotlin string concatenation - preserving indents with multiline stringsKotlin 字符串连接 - 使用多行字符串保留缩进
【发布时间】:2020-12-14 18:38:39
【问题描述】:

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 获得的缩进。有没有一种优雅的方式来处理这个问题?

【问题讨论】:

    标签: kotlin string-concatenation


    【解决方案1】:

    这是第一个字符串文字。 (为避免混淆,我将使用下划线表示空格。)

    ____hello
    ____world
    

    它的trimIndent() 调用将删除空格,使其没有缩进,如下所示:

    hello
    world
    

    第二个字符串如下所示:

    ________teststring2
    ________$myString
    

    然后$myString 将精确地替换为第一个的内容:

    ________teststring2
    ________hello
    world
    

    请注意,$myString 之前的缩进仍然存在,给出了您在“hello”之前看到的空格;但是myString 中没有缩进,所以在“world”之前看不到任何缩进。

    现在,trimIndent() 删除了“所有输入行的公共最小缩进”。但是这里没有共同的缩进,因为最后一行。所以第二个trimIndent() 调用什么都不做。

    至于做什么,可能有几种选择。如果您不想要任何缩进,那么最明显的是删除 all 缩进,而不仅仅是常见的缩进。 (我认为标准库中没有专门的函数,但编写一个应该很容易。例如,您可以将"^ *" 的正则表达式替换为""。)

    【讨论】:

      【解决方案2】:

      这是实践中常见的问题,不是trimIndent()的问题。 @gidds 已经解释得很清楚了。如果你想达到你想要的,你可以使用trimMargin()

      fun main(args: Array<String>) {
          val myString = """
          hello
          world
      """.trimIndent()
          
          println("""
              |teststring2
              |$myString
          """.trimMargin())
      }
      

      输出:

      teststring2
      hello
      world
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-18
        • 1970-01-01
        • 1970-01-01
        • 2019-06-23
        • 2012-07-06
        • 1970-01-01
        相关资源
        最近更新 更多