На самом деле проблема не в trimIndent
.Это связано с тем, как работают необработанные строковые литералы, когда они содержат параметры.Вы начинаете с этого:
{
val firstStr = """
OLOLO
""".trimIndent()
}
В результате firstStr
имеет это значение:
"
OLOLO"
Затем оно вводится в secondStr
с помощью этого кода:
{
val secondStr = """
$firstStr
new added text
""".trimIndent()
}
Теперь представьте, что вы на самом деле набрали это вместо использования значения параметра.Вы бы сделали это так (и я собираюсь заменить несколько пробелов подчеркиванием, чтобы прояснить что-то):
{
val secondStr = """
____OLOLO
new added text
""".trimIndent()
}
Это бы все работало нормально.Но когда значение вводится в необработанный строковый литерал, это на самом деле не то, что происходит, так как он даже не подозревает, что вы хотели поставить пробелы там, где я подчеркивал выше.Что касается системы, вы говорите ей просто вставить возврат каретки, тогда OLOLO
.Так что на самом деле происходит генерирование значения ( до вызова trimIndent
):
{
val secondStr = """
OLOLO
new added text
""".trimIndent()
}
А потом, к тому моменту, когда trimIndent
начинает работать с ним, сначалаон пытается найти общий отступ, но не может его найти, так как одна из строк (OLOLO
) не имеет отступа.Так что ничего не поделаешь.Вот почему пробел до new added text
остается).
Вы можете увидеть это, если поставить точку останова в реализации trimIndent
, чтобы увидеть, что является получателем (то есть какое значение secondStr
находится передtrimIndent
начинает свою работу).
Так что ваше решение верное.Добавьте символ трубы и используйте trimMargin
.Канал означает, что перед добавленным текстом нет 4 пробелов, поэтому он корректно все обрезает.