KOTET'S PERSONAL BLOG

#dlang 改行とかのある文字列をエスケープしないで書きたい

Created: , Last modified:
#dlang #qiita #tech #dlangman

これは1年以上前の記事です

ここに書かれている情報、見解は現在のものとは異なっている場合があります。

この記事はQiitaに投稿されたものの転載です。


AAなどの文字列はエスケープすると超絶見難くなるのでそのまま書きたくなった。

エスケープされ見るも無残な姿になってしまったD言語くん1

string dman = "      ____\n      L__L|\n      /    \\\n    /        \\\n  / _______    \\\n  \\ \\#/  \\/ \\  /\n   \\|#| O| O|#\\\n    |#L _L__ #|\n    |###|  |##|\n    /###/  /##|\n   /###/   /##|\n  /###/___/###/\n /###########/\n /##########/\n    /     \\\n    \\     /\n   _ \\   /__\n  |__/  |__/";

Delimited Stringsというものがある。2デリミタ、文字列の終了を表す記号のある文字列である。それを使って以下のように書ける。

string s = q"/123"\n\n"/";//string dman = "123\"\\n\\n\"";
writeln(s);

このように出力される

123"\n\n"

通常エスケープしなければならない"がそのまま出力され、改行を表すはずの\nがそのまま出力されている。うれしい。この場合/がデリミタとなって、それに囲まれた部分で自由に書ける。ただしデリミタである/は書けない。

string s = q"/a/a/";//エラーになる

ただしNesting Delimiterという特殊なデリミタもある。

string s1 = q"((a)())";//(a)()
string s2 = q"(a(a)";//これはだめ

たくさんのカッコで囲まれた文字列とかを書くときに必要かもしれない。

好きな言葉をデリミタに使うこともできる。その場合デリミタのすぐ後に改行を入れる必要がある。

ソースコード中に降臨できてご満悦のD言語くん

string dman = q"DmanisGod
      ____ 
      L__L|
      /    \
    /        \
  / _______    \
  \ \#/  \/ \  /
   \|#| O| O|#\
    |#L _L__ #|
    |###|  |##|
    /###/  /##|
   /###/   /##|
  /###/___/###/
 /###########/
 /##########/
    /     \
    \     /
   _ \   /__
  |__/  |__/
DmanisGod";
writeln(dman);

出力

      ____
      L__L|
      /    \
    /        \
  / _______    \
  \ \#/  \/ \  /
   \|#| O| O|#\
    |#L _L__ #|
    |###|  |##|
    /###/  /##|
   /###/   /##|
  /###/___/###/
 /###########/
 /##########/
    /     \
    \     /
   _ \   /__
  |__/  |__/

最後に改行ができてしまうため注意が必要である。


追記

``リテラルを知らなかったことに死ぬほどキレてるD言語くん3

string s =
`      ____
      L__L|
      /    \
    /        \
  / _______    \
  \ \#/  \/ \  /
   \|#| O| O|#\
    |#L _L__ #|
    |###|  |##|
    /###/  /##|
   /###/   /##|
  /###/___/###/
 /###########/
 /##########/
    /     \
    \     /
   _ \   /__
  |__/  |__/`;

こっちのほうがいいですね……