Kotlin でヒアドキュメント中の文字をエスケープをする

Kotlin には変数展開機能があるため、$ 記号を使いたい場合エスケープが必要になる。 ヒアドキュメントと通常の文字列でエスケープの方法が少し異なり、クセがあるのでメモ。

要件

  • Java 8
  • Kotlin 1.2.41

デモ

通常の文字列内でのエスケープ

println("\${xyz}") // OK: ${xyz}
1

ヒアドキュメント内でのエスケープ

println("""
\${xyz}
""".trimIndent()) // NG: Compile ERROR

println("""
\$\{xyz\}
""".trimIndent()) // NG: \$\{xyz\}

println("""
${'$'}{xyz}
""".trimIndent()) // OK: ${xyz}

val doller: Char = '$';
println("""
${doller}{xyz}
""".trimIndent()) // OK: ${xyz}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

Char 型の値として変数展開させた文字をくっつけて使う、というわけですね。どうしてヒアドキュメントだけエスケープ仕様違うんだろう🤔

Spring の SpEL 等では Kotlin での変数展開同様に、$ 記号がキーワードとして使われるため、この書き方は覚えておくとよさそう。