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'

Как, есть способ подразумевать конкатенацию?

Ответ 1

Есть кусочки этого ответа, которые помогли мне получить то, что мне было нужно (легкая многострочная конкатенация БЕЗ дополнительных пробелов), но поскольку ни один из фактических ответов не имел ее, я компилирую их здесь:

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"

Последний был в основном для ситуаций, требующих большей гибкости в обработке. Мне лично это не нравится, он ставит обработку в странное место w.r.t. строка (т.е. перед ней, но с использованием методов экземпляра, которые обычно появляются после этого), но там. Обратите внимание, что если вы отступаете от последнего идентификатора END_SQL (что является общим, так как это, вероятно, внутри функции или модуля), вам нужно будет использовать переносимый синтаксис (т.е. p <<-END_SQL вместо p <<END_SQL). В противном случае отступы пробелов заставляют идентификатор интерпретироваться как продолжение строки.

Это не экономит много ввода, но для меня это выглядит лучше, чем использование знаков +.

EDIT: добавление еще одного:

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

Ответ 2

Да, если вы не возражаете против добавления дополнительных строк:

 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

Ответ 3

В ruby ​​2.0 теперь вы можете просто использовать %

Например:

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

Ответ 4

Существует несколько синтаксисов для многострочных строк, которые вы уже прочитали. Мой любимый стиль 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.

Обратите внимание, что если вы используете многострочные Perl или heredocs, как предложили Марк и Питер, вы получите потенциально ненужные пробелы. Как в моих примерах, так и в их примерах строки "from" и "where" содержат ведущие пробелы из-за их отступов в коде. Если это пробел не требуется, вы должны использовать конкатенированные строки, как вы сейчас делаете.

Ответ 5

Иногда стоит удалить новые символы строки \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

Ответ 6

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

Ответ 7

Вы также можете использовать три двойных кавычки

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

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

Если необходимо удалить разрывы строк "\n", используйте обратную косую черту "\" в конце каждой строки

Ответ 8

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'

< < является оператором конкатенации для строк

Ответ 9

Если вы не учитываете дополнительные пробелы и символы новой строки, вы можете использовать

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 для интерполированных строк)

Ответ 10

Другие параметры:

#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

Ответ 11

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

Это предложение имеет преимущество перед здесь - документы и длинные строки, которые автоиндекторы могут соответствующим образом отступать от каждой части строки. Но это достигается за счет эффективности.

Ответ 12

Чтобы избежать закрытия круглых скобок для каждой строки, вы можете просто использовать двойные кавычки с обратным слэшем для выхода из новой строки:

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

Ответ 13

В последнее время с новыми функциями в 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