Разбивка длинных строк на несколько строк в Ruby без зачистки новых строк

недавно мы решили на моей работе в руководстве ruby style. Один из указов гласит, что ни одна строка не должна быть шире 80 символов. Поскольку это проект Rails, у нас часто есть строки, которые немного длиннее - например, "пользователь X хотел отправить вам сообщение о вещи Y", которое не всегда вписывается в ограничение стиля 80 символов.

Я понимаю, что есть три способа иметь длинный диапазон строк несколько строки:

  • помощи heredoc
  • %Q{}
  • фактическая конкатенация строк.

однако все эти случаи в конечном итоге занимают больше вычислительных циклов, что кажется глупым. Очевидно, конкатенация строк, но для HEREDOC и %Q я должен удалить новые строки через что-то вроде .gsub (/n$/,").

есть ли чистый синтаксический способ сделать это, что эквивалентно просто иметь всю строку на одной строке? Цель, очевидно, состоит в том, чтобы не тратьте дополнительные циклы только потому, что я хочу, чтобы мой код был немного более читаемым. (Да, я понимаю, что вы должны сделать этот компромисс много...но для длины строки, это просто глупо.)

обновление: Обратные косые черты не совсем то, что я хочу, потому что вы теряете отступ, что действительно влияет на стиль/читаемость.

пример:

if foo
  string = "this is a   
string that spans lines"  
end

Я нахожу выше немного трудно читать.

редактировать: я добавил Ответ ниже; три года позже у нас теперь есть squiggly heredoc.

5 ответов


может быть, это то, что вы ищете?

string = "line #1"\
         "line #2"\
         "line #3"

p string # => "line #1line #2line #3"

можно использовать \ чтобы указать, что любая строка Ruby продолжается в следующей строке. Это работает и со строками:

string = "this is a \
string that spans lines"

puts string.inspect

выводит "this is a string that spans lines"


три года спустя в Ruby 2.3 появилось решение: извилистый heredoc.

class Subscription
  def warning_message
    <<~HEREDOC
      Subscription expiring soon!
      Your free trial will expire in #{days_until_expiration} days.
      Please update your billing information.
    HEREDOC
  end
end

ссылка на блог:https://infinum.co/the-capsized-eight/articles/multiline-strings-ruby-2-3-0-the-squiggly-heredoc

отступ линии с наименьшим отступом будет удаляется из каждой строки содержимого.


У меня была эта проблема, когда я пытаюсь написать очень длинный url-адрес, следующие работы.

image_url = %w(
    http://minio.127.0.0.1.xip.io:9000/
    bucket29/docs/b7cfab0e-0119-452c-b262-1b78e3fccf38/
    28ed3774-b234-4de2-9a11-7d657707f79c?
    X-Amz-Algorithm=AWS4-HMAC-SHA256&
    X-Amz-Credential=AJAKJFAFGAKAJDDAF
    %2Fus-east-1%2Fs3%2Faws4_request&
    X-Amz-Date=20170702T000940Z&
    X-Amz-Expires=3600&X-Amz-SignedHeaders=host&
    X-Amz-Signature=QEWKJRQJEWR813247812347FKFS
    KQWREJQ3108418324732o45o1324kldsfjasf
).join

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

здесь у вас есть отступ для удобочитаемости, простоты модификации, без кавычек и обратных косых черт на каждой строке. Стоимость соединения струн должна быть незначительной.


Я изменил ответ Зака, так как я требуются пробелы и интерполяция, но не новые строки и используется:

%W[
  It's a nice day "#{name}"
  for a walk!
].join(' ')

здесь name = 'fred' это производит It's a nice day "fred" for a walk!