web-dev-qa-db-ja.com

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'

のように、連結を意味する方法はありますか?

356
Zombies

この答えには、私が必要なもの(余分な空白なしで簡単な複数行の連結)を得るのに役立つ部分がありますが、実際の答えのどれにも含まれていないので、ここでコンパイルします。

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)を使用する必要があります。それ以外の場合、インデントの空白は識別子を文字列の続きとして解釈させます。

これはタイピングをそれほど節約しませんが、+記号を使用するよりも見栄えがよくなります。

編集:もう一つ追加:

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

はい、余分な改行が挿入されても構わないのであれば:

 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'

あるいは、 heredoc を使用することもできます。

conn.exec <<-eos
   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
eos
162
Mark Byers

Ruby 2.0では%を使うことができます

例えば:

SQL = %{
SELECT user, name
FROM users
WHERE users.id = #{var}
LIMIT #{var2}
}
158

すでに読んだように、複数行の文字列には複数の構文があります。私のお気に入りはPerlスタイルです。

conn.exec %q{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}

複数行の文字列は%qで始まり、その後に{、[または(が続き、対応する反転文字で終わります。%qは補間を許可しません。%Qは補間を許可しないため、次のように記述できます。

conn.exec %Q{select attr1, attr2, attr3, attr4, attr5, attr6, attr7
      from #{table_names},
      where etc etc etc etc etc etc etc etc etc etc etc etc etc}

私は実際にこれらの種類の複数行の文字列がどのように呼ばれているのかわからないので、単にそれらをPerl複数行と呼びましょう。

ただし、MarkおよびPeterが提案したようにPerlのマルチラインまたはheredocsのどちらを使用しても、不要な空白が生じる可能性があります。私の例でもその例でも、 "from"と "where"の行にはコードのインデントのために先頭の空白が含まれています。この空白文字が望ましくない場合は、現在行っているように連結文字列を使用する必要があります。

51
Hongli

\nのような改行文字を削除する価値がある場合があります。

conn.exec <<-eos.squish
 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
eos
29
Kamil Lelonek

二重引用符も使用できます

x = """
this is 
a multiline
string
"""

2.3.3 :012 > x
 => "\nthis is\na multiline\nstring\n"

改行を削除する必要がある場合は、各行の末尾にバックスラッシュを使用してください。

19
juliangonzalez
conn.exec = <<eos
  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
eos
16
Peter

別のオプション:

#multi line string
multiline_string = <<EOM
This is a very long string
that contains interpolation
like #{4 + 5} \n\n
EOM

puts multiline_string

#another option for multiline string
message = <<-EOF
asdfasdfsador #{2+2} this month.
asdfadsfasdfadsfad.
EOF

puts message
12
Alex Cohen

最近のRuby 2.3の新機能で、新しいsquiggly HEREDOCは最小限の変更であなたが私たちの複数行の文字列をいい方法で書くことを可能にするので、これを.squishと組み合わせて使うことであなたは素晴らしい方法で複数行を書くことができます!

[1] pry(main)> <<~SQL.squish
[1] pry(main)*   select attr1, attr2, attr3, attr4, attr5, attr6, attr7
[1] pry(main)*   from table1, table2, table3, etc, etc, etc, etc, etc,
[1] pry(main)*   where etc etc etc etc etc etc etc etc etc etc etc etc etc
[1] pry(main)* SQL
=> "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"

ref: https://infinum.co/the-capsized-eight/multiline-strings-Ruby-2-3-0-the-squiggly-heredoc

10
Mark Jad
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'

<<は文字列の連結演算子です

7
Dom Brezinski

余分なスペースや改行を気にするなら、

conn.exec %w{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} * ' '

(補間文字列には%Wを使用してください)

5
UncleGene
conn.exec [
  "select attr1, attr2, attr3, ...",
  "from table1, table2, table3, ...",
  "where ..."
].join(' ')

この提案は、自動インデントが文字列の各部分を適切にインデントできるという、here-documentsや長い文字列よりも有利です。しかし、それは効率を犠牲にしています。

3
Aidan Cully

各行の括弧が閉じないようにするには、二重引用符とバックスラッシュを使って改行をエスケープするだけです。

"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"
3
Pwnrar