ヒアドキュメントについてまとめてみた。（Ruby）

こんにちは、プレイライフの熊崎です！
本日コロナワクチンの2回目接種を行ってきました。
接種から10時間後くらいに副反応が出るとのことでしたので、めっちゃびびっています笑

こんな話は置いておいて、本日はヒアドキュメントについての記事を書いていきたいと思います。

## そもそもヒアドキュメントって何？

> ヒアドキュメントとは、プログラミング言語などの機能の一つで、特殊な記号などを含む文字列リテラルをソースコード中に記述するための特別な記法のこと。
UNIX系OSのシェルスクリプトやスクリプト言語などでよく見られる機能で、改行や引用符などを含む任意の文字列を、指定した範囲内に書いた通りに文字列リテラルとすることができる。内部で変数展開などが行える言語もある。
引用元：[https://e-words.jp/w/%E3%83%92%E3%82%A2%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88.html](https://e-words.jp/w/%E3%83%92%E3%82%A2%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88.html)

→ 指定した範囲内では、""とか\nなどを使用しなくても良い書き方。

## ヒアドキュメントの利点
- 複数行に渡る長い文字列を作成する場合にはスッキリ、見やすく書ける。
- ↑そのため、可読性が上がる。


## 使い方（rubyの場合）
### 基本形
`<<識別子`と`識別子`で囲む。

```sample.rb
mail = <<MAIL # 識別子は、記述する文字列の中に含まれる文字列以外なら自由に名前を付けられる。
【TO】 
佐藤太郎

【FROM】 
鈴木二郎

【SUBJECT】 
本日の業務内容

【CONTENT】
・ ヒアドキュメントのインプットとアウトプットを行った。

MAIL

puts mail

# 以下、出力結果

# => 【TO】 
#    佐藤太郎

#    【FROM】 
#    鈴木二郎

#    【SUBJECT】 
#    本日の業務内容

#    【CONTENT】
#    ・ ヒアドキュメントのインプットとアウトプットを行った。


# ちなみに上記の文章を普通に書くと、以下のようになる。
mail = "【TO】 \n佐藤太郎\n\n【FROM】 \n鈴木二郎\n\n【SUBJECT】 \n本日の業務内容\n\n【CONTENT】\n・ ヒアドキュメントのインプットとアウトプットを行った。\n\n"
# ↑
# かなり読みづらい。もっと長文になったらさらに読みづらいし書きづらくなる。
```

上の形でも十分わかり易くはなったが、

- 識別子のインデントをずらす。
- 文章のインデントをずらす。

以上２つを行うと、もっと可読性が上がる。

### 識別子のインデントをずらす。
`<<-識別子`とすることで、終わりの識別子のインデントをずらすことができる。

```sample.rb
mail = <<-MAIL
【TO】 
佐藤太郎

【FROM】 
鈴木二郎

【SUBJECT】 
本日の業務内容

【CONTENT】
・ ヒアドキュメントのインプットとアウトプットを行った。
       MAIL

puts mail
# 以下、出力結果

# => 【TO】 
#    佐藤太郎

#    【FROM】 
#    鈴木二郎

#    【SUBJECT】 
#    本日の業務内容

#    【CONTENT】
#    ・ ヒアドキュメントのインプットとアウトプットを行った。
```

### 本文のインデントをずらす。
`<<~識別子`とすることで、内部の文字列のインデントを動かしても、先頭の空白部分が無視される。

```sample.rb
mail = <<~MAIL
         【TO】 
         佐藤太郎

         【FROM】 
         鈴木二郎

         【SUBJECT】 
         本日の業務内容

         【CONTENT】
         ・ ヒアドキュメントのインプットとアウトプットを行った。
       MAIL

puts mail

# 以下、出力結果

# => 【TO】 
#    佐藤太郎

#    【FROM】 
#    鈴木二郎

#    【SUBJECT】 
#    本日の業務内容

#    【CONTENT】
#    ・ ヒアドキュメントのインプットとアウトプットを行った。
```

### 式展開
ヒアドキュメント内部でも式展開ができる。（式展開をさせたくない場合には識別子をシングルクォートで囲む。）

```sample.rb
to_name = "佐藤太郎"
mail = <<~MAIL
         【TO】 
         #{to_name}

         【FROM】 
         鈴木二郎

         【SUBJECT】 
         本日の業務内容

         【CONTENT】
         ・ ヒアドキュメントのインプットとアウトプットを行った。
       MAIL

puts mail

# 以下、出力結果

# => 【TO】 
#    佐藤太郎

#    【FROM】 
#    鈴木二郎

#    【SUBJECT】 
#    本日の業務内容

#    【CONTENT】
#    ・ ヒアドキュメントのインプットとアウトプットを行った。
```

## まとめ
- ヒアドキュメントを使用することで、複数行に渡る長い文字列をスッキリ、見やすく書ける。
- 出力結果を変えずに、識別子のみのインデントをずらす場合は`<<-識別子`、ヒアドキュメント内部の文字列のインデントをずらす場合は`<<~識別子`で開始する。
- ヒアドキュメントの内部でも式展開ができる。

## 追記事項
```bad_example.rb
mail = <<MAIL # 識別子は、記述する文字列の中に含まれる文字列以外なら自由に名前を付けられる。
【TO】 
佐藤太郎

【FROM】 
鈴木二郎

【SUBJECT】 
本日の業務内容

【CONTENT】
・ ヒアドキュメントのインプットとアウトプットを行った。

MAIL delivered # →指定した識別子の同じ行に別の文字が存在する場合は終了にならない！！

MAIL

puts mail

# 以下、出力結果

# => 【TO】 
#    佐藤太郎

#    【FROM】 
#    鈴木二郎

#    【SUBJECT】 
#    本日の業務内容

#    【CONTENT】
#    ・ ヒアドキュメントのインプットとアウトプットを行った。

#    MAIL delivered # →指定した識別子の同じ行に別の文字が存在する場合は終了にならない！！

```


## 参考文献
- [https://e-words.jp/w/%E3%83%92%E3%82%A2%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88.html](https://e-words.jp/w/%E3%83%92%E3%82%A2%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88.html)
- 伊藤淳一, プロを目指す人のためのRuby入門, 技術評論社, 2017, p43-45