Разбивка длинных строк на несколько строк в 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!