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, так и кавычки и строковый литерал процента), то можно использовать продолжение строки , поместив обратную косую черту \
в качестве последнего непробельного символа в строке. Это продолжит строку и заставит 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...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...attr7 from...etc, where..."
Больше деталей:
Рубиновый синтаксис HEREDOC
Работы Here Document Notation for Strings - это способ обозначить длинные блоки текста, встроенные в код. За ним <<
следует пользовательская строка (терминатор конца строки). Все последующие строки объединяются до тех пор, пока терминатор конца строки не будет найден в самом начале строки:
puts <<HEREDOC
Text Text Text Text
Bla Bla
HEREDOC
# -> "Text Text Text Text\nBlaBla"
Терминатор конца строки может быть выбран свободно, но обычно используется что-то вроде «EOS» (конец строки) или что-то, что соответствует домену строки, например «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
является то, что терминатор конца строки должен находиться в начале строки:
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 интерпретирует конец оператора, а последовательная строка, состоящая только из одних строк в строке, ничего не делает.