web-dev-qa-db-ja.com

Kotlinは複数行の文字列に改行を追加します

Kotlinでは、次のような複数行の文字列を作成します。

value expected = """
                |digraph Test {
                |${'\t'}Empty1;
                |${'\t'}Empty2;
                |}
                |""".trimMargin()

次のように出力すると、文字列にキャリッジリターン文字(ASCIIコード13)がないことがわかります。

println("Expected bytes")
println(expected.toByteArray().contentToString())

出力:

Expected bytes
[100, 105, 103, 114, 97, 112, 104, 32, 84, 101, 115, 116, 32, 123, 10, 9, 69, 109, 112, 116, 121, 49, 59, 10, 9, 69, 109, 112, 116, 121, 50, 59, 10, 125, 10]

私がユニットテストしようとしているコードがPrintWriterを介して同じ文字列を構築するとき、それはlineSeparatorプロパティを介して行を線引きします:

/* 
 * Line separator string.  This is the value of the line.separator
 * property at the moment that the stream was created.
 */

そのため、出力ではlooksと同じ文字列になりますが、異なるバイトで構成されているため、等しくありません。

Actual bytes
[100, 105, 103, 114, 97, 112, 104, 32, 84, 101, 115, 116, 32, 123, 13, 10, 9, 69, 109, 112, 116, 121, 49, 59, 13, 10, 9, 69, 109, 112, 116, 121, 50, 59, 13, 10, 125, 13, 10]

この文字列宣言中に対処するより良い方法は、複数行の文字列を、それぞれchar(13)で接尾辞を付けることができる連結された文字列に分割することですか?

または、次のようなことをしたいです:

value expected = """
                |digraph Test {
                |${'\t'}Empty1;
                |${'\t'}Empty2;
                |}
                |""".trimMargin().useLineSeparator(System.getProperty("line.separator"))

または.replaceAll()など。

標準的な方法はありますか、それとも独自の拡張関数をStringに追加する必要がありますか?

7
Tom Tresansky

Kotlinの複数行の文字列は常に、行区切り文字として\ nを使用する文字列リテラルにコンパイルされます。プラットフォームに依存する行区切り記号が必要な場合は、replace("\n", System.getProperty("line.separator"))を実行できます。

Kotlin 1.2の時点では、このための標準ライブラリメソッドはないため、これを頻繁に使用する場合は、独自の拡張関数を定義する必要があります。

7
yole