こんなケース
- 長い文字列を複数行に分けて書きたい
- 得られる文字列に改行や不要な空白が含まれないで欲しい
- 美しくインデントされたコードになって欲しい
ヒアドキュメントだったり+で連結したり色々方法があるのだが、Rubyでは以下の記法が推奨されるらしい
sql = 'SELECT * ' \ 'FROM users ' \ 'WHERE active = 1 ' \ 'ORDER BY id' puts sql
以下のように出力される
SELECT * FROM users WHERE active = 1 ORDER BY id
これは一体何?
Rubyでは空白を間に挟んで複数の文字列リテラルを並べると1つの文字列として扱われる
str = 'a' 'b' 'c' puts str
これは以下のように出力される
abc
また、Rubyでは改行は文の終了を表すが、文末にバックスラッシュを置くと文の終了ではなく次の行に文が続いているものとして構文解析される。よって
str = 'a' \ 'b' \ 'c'
は
str = 'a' 'b' 'c'
と同等となる
まるでバックスラッシュが+
の代わりになってるように見えて知らないと面食らう構文だが、これが推奨らしい
その他の方法
ヒアドキュメント <<~
が良さそう
def build_sql sql = <<~SQL SELECT * \ FROM users \ WHERE created_at > '2022-01-01' \ AND enabled = 1 \ AND state = 'active' \ ORDER BY id; SQL sql end puts build_sql
SELECT * FROM users WHERE created_at > '2022-01-01' AND enabled = 1 AND state = 'active' ORDER BY id;
余分な改行や空白が含まれない文字列が得られる