Ruby: 複数行の文字列を連結せずに書くことはできますか?

概要

これをもう少し良くする方法はありますか?

conn.exec 'select attr1, attr2, attr3, attr4, attr5, attr6, attr7 ' +
          'from table1, table2, table3, etc, etc, etc, etc, etc, ' +
          'where etc etc etc etc etc etc etc etc etc etc etc etc etc'

たとえば、連結を暗示する方法はありますか?

解決策

この回答には、必要なもの(余分な空白なしの簡単な複数行の連結)を得るのに役立つ部分がありますが、実際の回答にはそれが含まれていなかったため、ここにまとめます。

str = 'this is a multi-line string'\
  ' using implicit concatenation'\
  ' to prevent spare \n\'s'

=> "this is a multi-line string using implicit concatenation to eliminate spare
\\n's"

おまけに、面白い HEREDOC 構文を使用したバージョンを次に示します (このリンクから)。

p <<END_SQL.gsub(/\s+/, " ").strip
SELECT * FROM     users
         ORDER BY users.id DESC
END_SQL
# >> "SELECT * FROM users ORDER BY users.id DESC"

後者は主に、処理にさらなる柔軟性が必要な状況に使用されます。私は個人的にはこれが好きではありません。処理を奇妙な場所に置きます。文字列 (つまり、文字列の前にありますが、通常は後に来るインスタンス メソッドを使用します) ですが、文字列はそこにあります。最後の END_SQL 識別子をインデントする場合 (これはおそらく関数またはモジュール内にあるため、これが一般的です)、ハイフンで区切られた構文 (つまり、p <<END_SQL の代わりに p <<-END_SQL) を使用する必要があることに注意してください。 。それ以外の場合、インデントされた空白により、識別子が文字列の継続として解釈されます。

これでは入力の手間が大幅に節約されるわけではありませんが、+ 記号を使用するよりも見栄えが良いと思います。

また (数年後の編集で言いますが) Ruby 2.3 以降を使用している場合は、演算子 <<~ も使用でき、これにより最終文字列から余分なインデントが削除されます。その場合、.gsub 呼び出しを削除できるはずです (ただし、開始インデントと最終的なニーズの両方に依存する可能性があります)。

編集:もう1つ追加します:

p %{
SELECT * FROM     users
         ORDER BY users.id DESC
}.gsub(/\s+/, " ").strip
# >> "SELECT * FROM users ORDER BY users.id DESC"