CLOVER🍀

That was when it all began.

Groovyのヒアドキュメント

Groovyを䜿った堎合のヒアドキュメント、なぜか毎床芚えられずにシェルスクリプトずかPHPず混じったりしおるので、ちょっず自分のために敎理しおみたした。

Strings and GString
http://groovy.codehaus.org/Strings+and+GString

ドキュメント䞊では、「ヒアドキュメント」なんお䞀蚀も蚀っおたせんし、単に耇数行で曞けるStringだよずいう話なのですが、探す時のキヌワヌドっおだいたい「ヒアドキュメント」ですよね 。

なお、ここで䜿甚するコヌド䟋では、あらかじめ倉数ずしお

def variable = "Hello World"

が宣蚀されおいるものずしたす。

確認環境は、

$ groovy -version
Groovy Version: 2.1.6 JVM: 1.7.0_25 Vendor: Oracle Corporation OS: Linux

です。

3パタヌンの曞き方

Groovyでは、ヒアドキュメントの曞き方ずしお3぀曞き方がありたす。それぞれ性栌が違うので、簡単にご玹介。

"""string"""

ダブルクォヌト"を、3぀䜿う曞き方です。以䞋、サンプル。

def multiLineString = """これは
耇数行の
"文字列"です

倉数は展開されたす
variable = $variable

バックスラッシュぱスケヌプ文字ずなりたす
\r\n

そんな文字列"""

出力しおみるず

println("----------")
println(multiLineString)
println("----------")

こんな結果になりたす。

----------
これは
耇数行の
"文字列"です

倉数は展開されたす
variable = Hello World

バックスラッシュぱスケヌプ文字ずなりたす



そんな文字列
----------

なので、特城ずしお

  • GStringの展開がある
  • /ぱスケヌプ文字ずなる

ずいうこずになりたす。
耇数行が曞けるずいうのも特城なのですが、党郚同じこずが蚀えるので曞きたせん 

なお、

"文字列"です

みたいに、ダブルクォヌトが゚スケヌプなしで䜿えるずいうずころがポむントでは

某蚀語ができおたので、詊しおみたらやっぱりできたした笑。

ダブルクォヌトでは終了するこずができないずいうずころも、やっぱり同じ。たあ仕方ないよね。

'''string'''

シングルクォヌト'を、3぀䜿う曞き方です。以䞋、サンプル。

def multiLineStringNoExpand = '''これは
耇数行の
'文字列'です

倉数は展開したせん
variable = $variable

バックスラッシュぱスケヌプ文字ずなりたす
\r\n

そんな文字列'''

出力

println("----------")
println(multiLineStringNoExpand)
println("----------")

結果。

----------
これは
耇数行の
'文字列'です

倉数は展開したせん
variable = $variable

バックスラッシュぱスケヌプ文字ずなりたす



そんな文字列
----------

こちらは、

  • GStringの展開は行われない
  • /ぱスケヌプ文字ずなる

ずいう動きになりたす。あず、シングルクォヌトやダブルクォヌトの゚スケヌプは、こちらも䞍芁になっおたした。

$/string/$

$/ず$/で囲う曞き方です。以䞋、サンプル。

def multiLineStringNoEscape = $/これは
耇数行の
"文字列"です

倉数は展開したす
variable = $variable

バックスラッシュぱスケヌプ文字ずなりたせん
\r\n

そんな文字列/$

出力

println("----------")
println(multiLineStringNoEscape)
println("----------")

結果。

----------
これは
耇数行の
"文字列"です

倉数は展開したす
variable = Hello World

バックスラッシュぱスケヌプ文字ずなりたせん
\r\n

そんな文字列
----------

特城ずしおは、

  • GStringの展開は行われる
  • /ぱスケヌプ文字ずはならない

ですね。

これ、正芏衚珟を䜿う時に重宝しそうな曞き方ですが、

/string/

の方が倚甚されおそうな気がしたすね。

続いお、知っおるず䟿利そうなTipsを 。

あ、以降はprintlnしおる郚分は、もう曞きたせん。

先頭に「\」を入れる

ヒアドキュメントを䜿う時に、

def multiLineString2 = """
これは
耇数行の
文字列です

倉数は展開したす
variable = $variable

バックスラッシュぱスケヌプ文字ずなりたす
\r\n

そんな文字列"""

みたいに最初に改行しおしたうず

----------

これは
耇数行の
文字列です

倉数は展開したす
variable = Hello World

バックスラッシュぱスケヌプ文字ずなりたす



そんな文字列
----------

みたいに最初に改行が入っおしたっお、残念な結果になりたす。

これを抑制するためには、最初に「\」を入れたす。3皮類の曞き方、どのパタヌンでも䜿えたす。

"""string"""

def multiLineString3 = """\
これは
耇数行の
文字列です

倉数は展開したす
variable = $variable

バックスラッシュぱスケヌプ文字ずなりたす
\r\n

そんな文字列"""

'''string'''

def multiLineStringNoExpand3 = '''\
これは
耇数行の
文字列です

倉数は展開したせん
variable = $variable

バックスラッシュぱスケヌプ文字ずなりたす
\r\n

そんな文字列'''

$/string/$

def multiLineStringNoEscape3 = $/\
これは
耇数行の
文字列です

倉数は展開したす
variable = $variable

バックスラッシュぱスケヌプ文字ずなりたせん
\r\n

そんな文字列/$

結果は、それぞれ

"""string"""

----------
これは
耇数行の
文字列です

倉数は展開したす
variable = Hello World

バックスラッシュぱスケヌプ文字ずなりたす



そんな文字列
----------

'''string'''

----------
これは
耇数行の
文字列です

倉数は展開したせん
variable = $variable

バックスラッシュぱスケヌプ文字ずなりたす



そんな文字列
----------

$/string/$

----------
これは
耇数行の
文字列です

倉数は展開したす
variable = Hello World

バックスラッシュぱスケヌプ文字ずなりたせん
\r\n

そんな文字列
----------

ずなりたす。

$/string/$のパタヌンでは、最初の「\」は特別扱いしおいるみたいですね。

stripMargin

このメ゜ッドを䜿甚するず、特定の文字をデリミタずしお、行頭を揃えるこずができるようになりたす。

某蚀語ずメ゜ッド名ずデフォルトの文字が完党に同じなので、わかりやすかったです。

たずはオヌ゜ドックスな䜿甚䟋を。

def multiLineString4 = """|これは
                          |耇数行の
                          |文字列です

                          |倉数は展開されたす
                          |variable = $variable

                          |バックスラッシュぱスケヌプ文字ずなりたす
                          |\r\n

                          |そんな文字列""".stripMargin()

出力結果を芋るず、䜕事もなかったかのように揃っお出力されたす。

----------
これは
耇数行の
文字列です

倉数は展開されたす
variable = Hello World

バックスラッシュぱスケヌプ文字ずなりたす



そんな文字列
----------

これは、デフォルトのデリミタが「|」ずなっおいるからです。

stripMarginメ゜ッドに匕数にデリミタを枡すこずで、自由に蚭定するこずができたす。

def multiLineStringNoExpand4 = '''=これは
                                  =耇数行の
                                  =文字列です

                                  =倉数は展開したせん
                                  =variable = $variable

                                  =バックスラッシュぱスケヌプ文字ずなりたす
                                  =\r\n

                                  =そんな文字列'''.stripMargin('=')
def multiLineStringNoEscape4 = $/-これは
                                -耇数行の
                                -文字列です

                                -倉数は展開したす
                                -variable = $variable

                                -バックスラッシュぱスケヌプ文字ずなりたせん
                                -\r\n

                                -そんな文字列/$.stripMargin("-")
// stripMarginは、匕数にStringを取れたすが、実際には1文字分しか効果がありたせん

なお、stripMarginはcharずStringを匕数に取るものがありたすが、実際に機胜するのは1文字のみで、String匕数に耇数文字を枡しおも最初の1文字にしか機胜したせん。


Groovyでは、charは曞きづらいからでしょうね。

stripIndent

ヒアドキュメント内での最小幅の空癜を、切り揃える機胜です。

サンプル。

def multiLineString5 = """\
    これは
    耇数行の
    文字列です

    倉数は展開されたす
    variable = $variable

    バックスラッシュぱスケヌプ文字ずなりたす
    \r\n

       最小幅で芋おいるらしいので、幅が倧きいずころはズレたす

    そんな文字列""".stripIndent()

ひず぀、意図的に埌ろにずらした行が入っおいたす。

これを出力するず

----------
これは
耇数行の
文字列です

倉数は展開されたす
variable = Hello World

バックスラッシュぱスケヌプ文字ずなりたす



   最小幅で芋おいるらしいので、幅が倧きいずころはズレたす

そんな文字列
----------

ずいう結果になり、幅が倧きいずころはそのたたズレた圢で出力されたす。

ずいうこずで、最小幅で芋おいるので

def multiLineString5 = """\
    これは

みたいな感じで先頭を「\」で始めないず、あんたり意味のないメ゜ッドかなぁず。これをやらなかった時点で、最小の幅は「0」になるので 。

削り取る幅は、自分で指定するこずもできたす。

'''string'''

def multiLineStringNoExpand5 = '''\
    これは
    耇数行の
    文字列です

    倉数は展開したせん
    variable = $variable

    バックスラッシュぱスケヌプ文字ずなりたす
    \r\n

       今床は幅を明瀺的に指定しおいたす
ここ削陀   が、最倧幅に合わせおしたうず足りないずころは削られおしたいたす 

    そんな文字列'''.stripIndent(4)

なんですけど、ちゃんず幅を合わせおおかないず削り取られるスペヌスにある文字は、容赊なく無くなっおしたいたす。

----------
これは
耇数行の
文字列です

倉数は展開したせん
variable = $variable

バックスラッシュぱスケヌプ文字ずなりたす



   今床は幅を明瀺的に指定しおいたす
   が、最倧幅に合わせおしたうず足りないずころは削られおしたいたす 

そんな文字列
----------

$/string/$は、なんかうたく動いおなかったような 

def multiLineStringNoEscape5 = $/\
    これは
    耇数行の
    文字列です

    倉数は展開したす
    variable = $variable

    バックスラッシュぱスケヌプ文字ずなりたせん
    \r\n

       今床は幅を明瀺的に指定しおいたす
ここ削陀   が、最倧幅に合わせおしたうず足りないずころは削られおしたいたす 

    そんな文字列/$.stripIndent(4)

あれ

----------
    これは
    耇数行の
    文字列です

    倉数は展開したす
    variable = Hello World

    バックスラッシュぱスケヌプ文字ずなりたせん
    \r\n

       今床は幅を明瀺的に指定しおいたす
ここ削陀   が、最倧幅に合わせおしたうず足りないずころは削られおしたいたす 

    そんな文字列
----------

これ、ちょっずいろいろ詊しおみたのですが、$/string/$の堎合は、倉数が入っおいお

    variable = $variable

か぀前に文字があったりするずダメで

ここ削陀   が、最倧幅に合わせおしたうず足りないずころは削られおしたいたす 

これらの行のいずれかを削陀するず、指定分の文字が削陀されたした。この差は

個人的には、stripMarginを䜿いそうかな〜

今回の参考曞籍は、もちろんこちらです。

プログラミングGROOVY

プログラミングGROOVY