超絶注意
基本的な構文を誤解していた為、誤った記述を大幅に削除しました。
(記事削除、絶賛検討中)
ハッシュリテラル中のヒアドキュメント
ヒアドキュメントはハッシュリテラルの中でも普通に使える。
ちなみに英語では"here document"らしい。
rice_to_meat_you.rb
hash = {cow:<<'EOS'}
______________
< I love beaf. >
--------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
EOS
puts hash[:cow]
複数のヒアドキュメントを使う
下のように書くと、ハッシュリテラルは1行で済む。
シンタックスハイライトと頭はぐちゃぐちゃになるかも。
(Qiitaのシンタックスハイライトは大丈夫。すごい)
パターン1/一括
hash = {one:<<HERE, two:<<HERE, three:<<HERE}
1
HERE
2
HERE
3
HERE
p hash
# => {:one=>"1\n", :two=>"2\n", :three=>"3\n"}
下のように分割すると分かりやすい。
パターン2/分割
hash = {
one:<<HERE,
1
HERE
two:<<HERE,
2
HERE
three:<<HERE,
3
HERE
}
p hash
# => {:one=>"1\n", :two=>"2\n", :three=>"3\n"}
ハッシュリテラルの最後のコンマは無視される。
付けるようにしたほうが何かと楽。
コンマは他の場所に打つと駄目。
ヒアドキュメントの基本
インデント
hash = {
one:<<-HERE,
1
HERE
two:<<-HERE
2
HERE
}
p hash
#{:one=>" 1\n", :two=>"2\n"}
ヒアドキュメントの開始の識別子の前に「-」を置くと、終端行をインデント可能。
「-」がない状態で終端行をインデントすると終端として認識されない。
本来、識別子以外の文字列が1文字でもあると終端にならないので。
もちろん、ヒアドキュメント中のインデントのスペースはそのまま。
末尾の改行を削除
hash = {one:<<HERE.chomp, two:<<HERE.rstrip}
1
HERE
2
HERE
p hash
# => {:one=>"1", :two=>"2"}
ただの文字列なので、そのままメソッド呼べる。
識別子を囲む点の違い
囲んだ点の文字列リテラルと同じ動作になる。
ダブルクォート (")
p <<"EOS"
#{1 + 1}
EOS
# => "2\n"
"#{1 + 1}"と同じ。普通の文字列。
点で囲まない場合もこれ。
シングルクォート (')
p <<'EOS'
#{1 + 1}
EOS
# => "\#{1 + 1}\n"
'#{1 + 1}'と同じ。(式展開とかエスケープ文字とかそのまま)
バッククォート (`)
p <<`EOS`
echo "hello world"
EOS
# => "hello world\n"
# `echo "hello world"`と同じ。(コマンド実行)
# (Markdownで「`」のエスケープの仕方が分からないのでコメントとして書いてます)
参考
- Ruby 2.1.0 リファレンスマニュアル - リテラル