Ruby-way (TM), починаючи з Ruby 2.3: щоб визначити багаторядковий рядок з новими рядками та належним ідентифікацією, використовуйте чітко 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
# -> "select...\nfrom...\nwhere..."
Якщо правильне ідентифікація не викликає занепокоєння, то одинарні та подвійні лапки можуть охоплювати кілька рядків у 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..."
Якщо одинарні або подвійні лапки є громіздкими, оскільки для цього знадобиться багато пробігу, то буквальне позначення відсоткових рядків %
є найбільш гнучким рішенням:
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..."
Якщо мета - уникнути нових рядків (що спричинить як чіткі HEREDOC, цитати, так і відсотковий буквальний ряд), то зворотний проріз як останній символ, що не пробігає, продовжить рядок і змусить Рубі об'єднати рядки назад у спину (стежте за пробілами всередині цитованого рядка):
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..."
Якщо ви використовуєте Rails, String.squish
то викресліть рядок провідного та останнього простору та згорнете всі послідовні пробіли (нові рядки, вкладки та всі) в єдиний пробіл:
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...from...where..."
Детальніше:
Синтаксис Ruby HEREDOC
Позначення документа тут для рядків - це спосіб позначити довгі блоки тексту в коді. Запускається за <<
ним, визначений користувачем String (термінатор End of String). Усі наступні рядки з'єднуються, поки на самому початку рядка не знайдеться термінатор End of String :
puts <<HEREDOC
Text Text Text Text
Bla Bla
HEREDOC
# -> "Text Text Text Text\nBlaBla"
Термінатор End of String можна вибирати вільно, але звичайно використовувати щось на зразок "EOS" (End of String) або щось, що відповідає домену String, наприклад "SQL".
HEREDOC підтримує інтерполяцію за замовчуванням або тоді, коли термінатор EOS подвійно цитується:
price = 10
print <<"EOS" # comments can be put here
1.) The price is #{price}.
EOS
# -> "1.) The price is 10."
Інтерполяцію можна відключити, якщо термінатор EOS одинарний:
print <<'EOS' # Disabled interpolation
3.) The price is #{price}.
EOS
# -> "3.) The price is #{price}."
Одне важливе обмеження <<HEREDOC
полягає в тому, що термінатор End of String повинен бути на початку рядка:
puts <<EOS
def foo
print "foo"
end
EOS
EOS
#-> "....def foo\n......print "foo"\n....end\n..EOS
Щоб обійти це, <<-
було створено синтаксис. Це дозволяє розширити термінатор EOS, щоб зробити вигляд кодом гарнішим. Рядки між <<-
термінатором та терміналом EOS досі використовуються в повному обсязі, включаючи всі відступи:
puts <<-EOS # Use <<- to indent End of String terminator
def foo
print "foo"
end
EOS
# -> "..def foo\n....print "foo"\n..end"
З Ruby 2.3 ми тепер чітко HEREDOC <<~
видаляє провідні пробіли:
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"
Порожні рядки та рядки, які містять лише вкладки та пробіл, << ігноруються
puts <<~EOS.inspect
Hello
World!
EOS
#-> "Hello\n..World!"
Якщо використовуються і вкладки, і пробіли, вкладки вважаються рівними 8 пробілам. Якщо рядок з найменшим відступом знаходиться в середині вкладки, ця вкладка не видаляється.
puts <<~EOS.inspect
<tab>One Tab
<space><space>Two Spaces
EOS
# -> "\tOne Tab\nTwoSpaces"
HEREDOC може виконувати деякі шалені речі, такі як виконання команд за допомогою зворотних посилань:
puts <<`EOC`
echo #{price}
echo #{price * 2}
EOC
Визначення рядка HEREDOC можна "скласти", що означає, що перший термінатор EOS (EOSFOO нижче) закінчить перший рядок і запустить другий (EOSBAR нижче):
print <<EOSFOO, <<EOSBAR # you can stack them
I said foo.
EOSFOO
I said bar.
EOSBAR
Я не думаю, що ніхто ніколи не використовував би це як таке, але <<EOS
насправді це просто буквений рядок, і його можна поставити там, де рядок зазвичай може бути поставлений:
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
Якщо у вас немає Ruby 2.3, але Rails >=
3.0, ви можете використовувати те, String.strip_heredoc
що робить те ж саме<<~
# 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
Відсотні рядкові літерали
Див RubyDoc про те , як використовувати знак відсотка , за яким слідує рядок в парі дужок , таких як %(...)
, %[...]
,%{...}
і т.д. , або пару будь-якого НЕ алфавітно - цифровий символ , такі як%+...+
Останні слова
Нарешті, щоб отримати відповідь на початкове запитання "Чи є спосіб припускати конкатекацію?" відповів: Ruby завжди має на увазі конкатенацію, якщо два рядки (одна і подвійна цитата) знайдені назад до спини:
puts "select..." 'from table...' "where..."
# -> "select...from table...where..."
Застереження полягає в тому, що це не працює при перервах рядків, тому що Ruby інтерпретує закінчення твердження, а послідовний рядок лише рядків у рядку нічого не робить.