Есть ли способ сделать это немного лучше?
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'
Мол, есть ли способ подразумевать конкатенацию?
ruby
code-formatting
Zombies
источник
источник
Ответы:
В этом ответе есть кусочки, которые помогли мне получить то, что мне было нужно (простая многострочная конкатенация БЕЗ лишних пробелов), но поскольку ни один из реальных ответов не дал этого, я собираю их здесь:
В качестве бонуса, вот версия с забавным синтаксисом HEREDOC (по этой ссылке ):
Последнее будет в основном для ситуаций, которые требуют большей гибкости при обработке. Мне лично это не нравится, оно помещает обработку в странное место по отношению к строке (то есть перед ней, но с использованием методов экземпляра, которые обычно идут после), но она есть. Обратите внимание, что если вы делаете отступ для последнего
END_SQL
идентификатора (который является общим, поскольку он, вероятно, находится внутри функции или модуля), вам нужно будет использовать синтаксис дефисов (то естьp <<-END_SQL
вместоp <<END_SQL
). В противном случае пробел с отступом приводит к тому, что идентификатор интерпретируется как продолжение строки.Это не сильно экономит время при наборе текста, но для меня это выглядит лучше, чем использование знаков +.
Также (я говорю в редакции, несколько лет спустя), если вы используете Ruby 2.3+, также доступен оператор << ~ , который удаляет лишние отступы из конечной строки. В этом случае вы сможете удалить
.gsub
вызов (хотя это может зависеть как от начального отступа, так и от ваших конечных потребностей).РЕДАКТИРОВАТЬ: Добавление еще одного:
источник
p <<END_SQL
должно бытьp <<-END_SQL
иначе это Ответ. При желании вы можете убрать начальные пробелы с помощью волнистого оператора HEREDOC,<<~END_SQL
<<~
к ответу было бы неплохо, в конечном итоге исследовать это оттуда. Лично я пользуюсь тем,<<~MSG.strip ... MSG
что также лишает последнего\n
.В ruby 2.0 теперь можно просто использовать
%
Например:
источник
squish
должен быть полезен.Да, если вы не возражаете против добавления новых строк:
В качестве альтернативы вы можете использовать heredoc :
источник
%Q(...)
%(...)
Есть несколько синтаксисов для многострочных строк, как вы уже прочитали. Мой любимый стиль Perl:
Многострочная строка начинается с% q, за которым следует {, [или (, а затем заканчивается соответствующим обратным символом.% Q не допускает интерполяцию;% Q делает так, что вы можете написать что-то вроде этого:
На самом деле я понятия не имею, как называются эти типы многострочных строк, поэтому давайте просто назовем их Perl multilines.
Однако обратите внимание, что независимо от того, используете ли вы Perl multilines или heredocs, как предлагали Марк и Питер, вы получите потенциально ненужные пробелы. И в моих примерах, и в их примерах строки «from» и «where» содержат начальные пробелы из-за их отступа в коде. Если этот пробел не нужен, вы должны использовать объединенные строки, как вы делаете сейчас.
источник
%q
семейства, будут включать переводы строк, которые не эквивалентны исходному коду.Иногда стоит удалить символы новой строки,
\n
такие как:источник
Вы также можете использовать двойные кавычки
Если необходимо удалить разрывы строк "\ n", используйте обратную косую черту "\" в конце каждой строки.
источник
"" + "double quotes with some content" + ""
."x"
выглядит лучше и работает быстрее, чем"""x"""
(что в основном так же, как""+"x"+""
) или"""""x"""""
(что так же, как"" + "" + "x" + "" + ""
). Это Ruby, а не Python, где вы используете"""
вместо того,"
когда вам нужна многострочная строка.источник
Другие опции:
источник
<<EOM
к<<-EOM
, нет?<<-EOF
примера. Я думаю, что так или иначе работает.Недавно, с новыми функциями в Ruby 2.3, новая
squiggly HEREDOC
позволит вам писать наши многострочные строки приятным способом с минимальными изменениями, поэтому использование этого в сочетании с.squish
(если вы используете rails) позволит вам писать многострочные записи хорошим способом! в случае просто использования ruby, вы можете сделать,<<~SQL.split.join(" ")
что почти то же самоессылка: https://infinum.co/the-capsized-eight/multiline-strings-ruby-2-3-0-the-squiggly-heroc
источник
<< - оператор конкатенации для строк
источник
+
является регулярным оператором конкатенации,<<
является на месте оператора Append. Использование побочных эффектов для литерала здесь работает (первая строка дважды модифицируется и возвращается), но ИМХО это странно и заставляет меня сделать двойной дубль, где+
было бы совершенно ясно. Но, может быть, я просто новичок в Ruby ...frozen_string_literal
включеноЕсли вы не возражаете против лишних пробелов и новых строк, вы можете использовать
(используйте% W для интерполированных строк)
источник
Чтобы избежать закрытия круглых скобок для каждой строки, вы можете просто использовать двойные кавычки с обратной косой чертой для перехода на новую строку:
источник
Это предложение имеет преимущество перед документами и длинными строками, заключающееся в том, что авто-отступы могут соответствующим образом создавать отступ для каждой части строки. Но это происходит за счет эффективности.
источник
Ruby-way (TM) начиная с Ruby 2.3: используйте волнистый HEREDOC
<<~
для определения многострочной строки с символами новой строки и правильными отступами:Если правильное отступление не имеет значения, одинарные и двойные кавычки могут занимать несколько строк в Ruby:
Если одинарные или двойные кавычки громоздки, потому что для этого потребуется много экранирования, то строковая литеральная нотация
%
является наиболее гибким решением:Если цель состоит в том, чтобы избежать перехода на новую строку (что вызовет как волнистый HEREDOC, так и кавычки и строковый литерал процента), то можно использовать продолжение строки , поместив обратную косую черту
\
в качестве последнего непробельного символа в строке. Это продолжит строку и заставит Ruby объединить строки подряд (следите за пробелами внутри строки в кавычках):Если вы используете Rails, то
String.squish
вы уберете строку начального и конечного пробелов и свернете все последовательные пробелы (переводы строк, табуляции и все) в один пробел:Больше деталей:
Рубиновый синтаксис HEREDOC
Работы Here Document Notation for Strings - это способ обозначить длинные блоки текста, встроенные в код. За ним
<<
следует пользовательская строка (терминатор конца строки). Все последующие строки объединяются до тех пор, пока терминатор конца строки не будет найден в самом начале строки:Терминатор конца строки может быть выбран свободно, но обычно используется что-то вроде «EOS» (конец строки) или что-то, что соответствует домену строки, например «SQL».
HEREDOC поддерживает интерполяцию по умолчанию или когда терминатор EOS заключен в двойные кавычки:
Интерполяция может быть отключена, если терминатор EOS заключен в одинарные кавычки:
Одним из важных ограничений
<<HEREDOC
является то, что терминатор конца строки должен находиться в начале строки:Чтобы обойти это,
<<-
синтаксис был создан. Это позволяет использовать терминатор EOS, чтобы код выглядел лучше. Строки между<<-
терминатором и EOS по-прежнему используются в полном объеме, включая все отступы:Начиная с Ruby 2.3, теперь у нас есть волнистый HEREDOC,
<<~
удаляющий начальные пробелы:Пустые строки и строки, содержащие только табуляции и пробел, игнорируются << ~
Если используются и табуляция, и пробелы, табуляция считается равной 8 пробелам. Если строка с наименьшим отступом находится в середине вкладки, эта вкладка не удаляется.
HEREDOC может делать некоторые сумасшедшие вещи, такие как выполнение команд с помощью обратных галочек:
Определения строк HEREDOC могут быть «сложены», что означает, что первый терминатор EOS (EOSFOO ниже) завершит первую строку и начнет вторую (EOSBAR ниже):
Я не думаю, что кто-нибудь когда-либо будет использовать его как таковой, но на
<<EOS
самом деле это просто строковый литерал, и его можно поместить везде, где обычно может быть строка:Если у вас нет Ruby 2.3, но есть Rails
>=
3.0, вы можете использоватьString.strip_heredoc
то же самое, что и<<~
Процентные строковые литералы
См RubyDoc о том , как использовать знак процента следуют строки в скобках пары , такие как
%(...)
,%[...]
,%{...}
и т.д. , или пару любого не алфавитно - цифровой символ , такие как%+...+
Последние слова
Наконец, чтобы получить ответ на оригинальный вопрос "Есть ли способ подразумевать конкатенацию?" ответил: Ruby всегда подразумевает конкатенацию, если две строки (одинарные и двойные в кавычках) встречаются вплотную:
Предостережение в том, что это не работает через разрывы строк, потому что Ruby интерпретирует конец оператора, а последовательная строка, состоящая только из одних строк в строке, ничего не делает.
источник
Элегантный ответ сегодня:
Существует разница в
<<-TEXT
и<<~TEXT
, первый сохраняет интервал внутри блока, а второй нет.Есть и другие варианты. Как конкатенация и т. Д., Но в целом это имеет больше смысла.
Если я ошибаюсь, дайте мне знать, как ...
источник
Как и вы, я также искал решение, которое не включает переводы строк . (Хотя они могут быть безопасны в SQL, в моем случае они небезопасны, и у меня есть большой блок текста, чтобы иметь дело с ним)
Возможно, это так же уродливо, но вы можете использовать обратную черту-обратную черту в heredoc, чтобы исключить их из полученной строки:
Обратите внимание, что вы не можете сделать это без интерполяции (IE
<<~'END_OF_INPUT'
), поэтому будьте осторожны.#{expressions}
будет оцениваться здесь, тогда как они не будут в вашем исходном коде. Ответ А. Уилсона может быть лучше по этой причине.источник