LoginSignup
20
19

More than 5 years have passed since last update.

ハッシュリテラルの中でヒアドキュメントを使う (Ruby)

Last updated at Posted at 2014-03-19

超絶注意

基本的な構文を誤解していた為、誤った記述を大幅に削除しました。
(記事削除、絶賛検討中)

ハッシュリテラル中のヒアドキュメント

ヒアドキュメントはハッシュリテラルの中でも普通に使える。
ちなみに英語では"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 リファレンスマニュアル - リテラル
20
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
19