Ruby-way (TM) sejak Ruby 2.3: Gunakan HEREDOC berlekuk - lekuk<<~
untuk mendefinisikan string multi-line dengan baris baru dan lekukan yang tepat:
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
# -> "select...\nfrom...\nwhere..."
Jika indentasi yang tepat bukan masalah, maka kutipan tunggal dan ganda dapat menjangkau beberapa baris di 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"
# -> "select...\n from...\n where..."
Jika tanda kutip tunggal atau ganda rumit karena itu akan membutuhkan banyak pelarian, maka persen notasi string literal %
adalah solusi yang paling fleksibel:
conn.exec %(select attr1, attr2, attr3, attr4, attr5, attr6, attr7
from table1, table2, table3, etc, etc, etc, etc, etc
where (ProductLine = 'R' OR ProductLine = "S") AND Country = "...")
# -> "select...\n from...\n where..."
Jika tujuannya adalah untuk menghindari baris baru (yang menyebabkan HEREDOC berlekuk-lekuk, kutipan dan persen string literal akan menyebabkan), maka kelanjutan garis dapat digunakan dengan menempatkan backslash \
sebagai karakter non-spasi putih terakhir dalam satu baris. Ini akan melanjutkan baris dan akan menyebabkan Ruby menyatukan Strings back to back (perhatikan ruang-ruang di dalam string yang dikutip):
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'
# -> "select...from...where..."
Jika Anda menggunakan Rails String.squish
akan menghapus string ruang memimpin dan mengekor dan menciutkan semua spasi putih berurutan (baris baru, tab, dan semua) menjadi satu ruang:
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".squish
# -> "select...attr7 from...etc, where..."
Keterangan lebih lanjut:
Sintaks Ruby HEREDOC
Notasi Dokumen Di Sini untuk karya Strings adalah cara untuk menunjuk blok panjang inline teks dalam kode. Ini dimulai dengan <<
diikuti oleh String yang ditentukan pengguna (ujung terminator String). Semua baris berikut digabungkan sampai akhir Terminator String ditemukan di awal baris:
puts <<HEREDOC
Text Text Text Text
Bla Bla
HEREDOC
# -> "Text Text Text Text\nBlaBla"
Terminator End of String dapat dipilih secara bebas, tetapi biasanya menggunakan sesuatu seperti "EOS" (End of String) atau sesuatu yang cocok dengan domain String seperti "SQL".
HEREDOC mendukung interpolasi secara default atau ketika terminator EOS dikutip ganda:
price = 10
print <<"EOS" # comments can be put here
1.) The price is #{price}.
EOS
# -> "1.) The price is 10."
Interpolasi dapat dinonaktifkan jika terminator EOS dikutip satu kali:
print <<'EOS' # Disabled interpolation
3.) The price is #{price}.
EOS
# -> "3.) The price is #{price}."
Salah satu batasan penting <<HEREDOC
adalah bahwa terminator End of String harus berada di awal baris:
puts <<EOS
def foo
print "foo"
end
EOS
EOS
#-> "....def foo\n......print "foo"\n....end\n..EOS
Untuk menyiasati ini, <<-
sintaks telah dibuat. Ini memungkinkan terminator EOS untuk membuat indentasi membuat kode terlihat lebih bagus. Garis antara <<-
terminator EOS dan masih digunakan dalam perpanjangan penuh termasuk semua lekukan:
puts <<-EOS # Use <<- to indent End of String terminator
def foo
print "foo"
end
EOS
# -> "..def foo\n....print "foo"\n..end"
Sejak Ruby 2.3, kami sekarang memiliki HEREDOC berlekuk <<~
menghapus spasi putih terkemuka:
puts <<~EOS # Use the squiggly HEREDOC <<~ to remove leading whitespace (since Ruby 2.3!)
def foo
print "foo"
end
EOS
# -> "def foo\n..print "foo"\nend"
Baris dan garis kosong yang hanya berisi tab dan spasi diabaikan oleh << ~
puts <<~EOS.inspect
Hello
World!
EOS
#-> "Hello\n..World!"
Jika tab dan spasi digunakan, tab dianggap sama dengan 8 spasi. Jika garis yang sedikit berlekuk berada di tengah-tengah tab, tab ini tidak dihapus.
puts <<~EOS.inspect
<tab>One Tab
<space><space>Two Spaces
EOS
# -> "\tOne Tab\nTwoSpaces"
HEREDOC dapat melakukan beberapa hal gila seperti mengeksekusi perintah menggunakan backticks:
puts <<`EOC`
echo #{price}
echo #{price * 2}
EOC
Definisi HEREDOC String dapat "ditumpuk", yang berarti bahwa terminator EOS pertama (EOSFOO di bawah) akan mengakhiri string pertama dan memulai yang kedua (EOSBAR di bawah):
print <<EOSFOO, <<EOSBAR # you can stack them
I said foo.
EOSFOO
I said bar.
EOSBAR
Saya tidak berpikir ada orang yang akan menggunakannya seperti itu, tetapi <<EOS
ini benar-benar hanya string literal dan dapat diletakkan di mana pun string biasanya dapat diletakkan:
def func(a,b,c)
puts a
puts b
puts c
end
func(<<THIS, 23, <<THAT)
Here's a line
or two.
THIS
and here's another.
THAT
Jika Anda tidak memiliki Ruby 2.3, tetapi Rails >=
3.0 maka Anda dapat menggunakan String.strip_heredoc
yang melakukan hal yang sama<<~
# File activesupport/lib/active_support/core_ext/string/strip.rb, line 22
class String
def strip_heredoc
gsub(/^#{scan(/^[ \t]*(?=\S)/).min}/, "".freeze)
end
end
puts <<-USAGE.strip_heredoc # If no Ruby 2.3, but Rails >= 3.0
This command does such and such.
Supported options are:
-h This message
...
USAGE
Persen String Literal
Lihat RubyDoc untuk bagaimana menggunakan tanda persentase diikuti dengan string dalam kurung pasangan seperti %(...)
, %[...]
, %{...}
, dll atau sepasang karakter non-alfanumerik seperti%+...+
Kata-kata terakhir
Terakhir, untuk mendapatkan jawaban atas pertanyaan awal "Apakah ada cara untuk menyiratkan penggabungan?" jawab: Ruby selalu menyiratkan penggabungan jika dua string (tunggal dan ganda dikutip) ditemukan kembali ke belakang:
puts "select..." 'from table...' "where..."
# -> "select...from table...where..."
Peringatannya adalah bahwa ini tidak bekerja lintas baris, karena Ruby menafsirkan akhir pernyataan dan garis konsekuen hanya string saja pada suatu garis tidak melakukan apa-apa.