1. ホーム
  2. ルビー

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

2022-03-24 13:20:05

質問

もう少し見栄えをよくする方法はないでしょうか?

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構文を使ったバージョンもあります(via. このリンク ):

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 この場合、開始時のインデントと最終的な必要性の両方に依存するかもしれませんが)。

EDIT:もう一つ追加。

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