Ruby: Могу ли я написать многострочную строку без конкатенации? - PullRequest
356 голосов
/ 25 февраля 2010

Есть ли способ сделать это немного лучше?

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'

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

Ответы [ 13 ]

531 голосов
/ 17 мая 2011

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

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). В противном случае пробел с отступом приводит к тому, что идентификатор интерпретируется как продолжение строки.

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

РЕДАКТИРОВАТЬ: Добавление еще одного:

p %{
SELECT * FROM     users
         ORDER BY users.id DESC
}.gsub(/\s+/, " ").strip
# >> "SELECT * FROM users ORDER BY users.id DESC"
162 голосов
/ 25 февраля 2010

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

 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
161 голосов
/ 28 августа 2013

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

Например:

SQL = %{
SELECT user, name
FROM users
WHERE users.id = #{var}
LIMIT #{var2}
}
51 голосов
/ 26 февраля 2010

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

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

29 голосов
/ 16 июля 2014

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

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

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

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

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

16 голосов
/ 25 февраля 2010
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
12 голосов
/ 28 декабря 2016

Другие опции:

#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
10 голосов
/ 01 октября 2017

Недавно с новыми функциями в 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

7 голосов
/ 25 февраля 2010
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'

<< - оператор конкатенации для строк </p>

...