Есть ли простой способ делать многострочные строки с отступом в Ruby? - программирование
Подтвердить что ты не робот

Есть ли простой способ делать многострочные строки с отступом в Ruby?

Скажем, я хотел иметь очень большой блок довольно напечатанного html-кода, связанного с моим кодом ruby. Каков самый чистый способ сделать это, не теряя форматирования в моей строке или не помню какое-то выражение gsub.

Кодирование всего в одной строке легко сделать, но трудно читать:

1.times do
  # Note that the spaces have been changed to _ so that they are easy to see here.
  doc = "\n<html>\n__<head>\n____<title>\n______Title\n____</title>\n__</head>\n__<body>\n____Body\n__</body>\n</html>\n"
  ans = "Your document: %s" % [doc]
  puts ans
end

Многострочный текст в ruby ​​легче читать, но строка не может быть отступом с остальной частью кода:

1.times do
  doc = "
<html>
  <head>
    <title>
      Title
    </title>
  </head>
  <body>
    Body
  </body>
</html>
"
  ans = "Your document: %s" % [doc]
  puts ans
end

Например, следующий код имеет отступ с моим кодом, но теперь строка имеет четыре дополнительных пробела перед каждой строкой:

1.times do
  doc = <<-EOM

    <html>
      <head>
        <title>
          Title
        </title>
      </head>
      <body>
        Body
      </body>
    </html>
  EOM
  ans = "Your document: %s" % [doc]
  puts ans
end

Большинство людей идут с кодом HEREDOC выше и заменяют регулярное выражение на результат, чтобы извлечь лишние пробелы в начале каждой строки. Я хотел бы, чтобы каждый раз мне не приходилось сталкиваться с проблемой регулярного выражения.

4b9b3361

Ответ 1

string = %q{This
    is
        indented
  and
    has
         newlines}

Здесь - это блог с некоторыми примерами %q{}, %q{} и других.

Насколько легко запомнить, подумайте "Q" для "Котировки".

Sidenote: Технически вам не нужно "q" во время цитаты.

string = %{This
   also
      is indented
  and
     has
   newlines
      and handles interpolation like 1 + 1 = #{1+1}
}

Однако лучше всего использовать %q{}.

Ответ 2

Так как Ruby 2.3, полоски <<~ heredoc приводят к пробелу содержимого:

def make_doc(body)
  <<~EOF
  <html>
    <body>
      #{body}
    </body>
  </html>
  EOF
end

puts make_doc('hello')

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

def make_doc(body)
  "<html>\n"       \
  "  <body>\n"     \
  "    #{body}\n"  \
  "  </body>\n"    \
  "</html>"
end

Ответ 3

Это не совсем очевидно, о чем вы просите. Если бы я хотел генерировать строки типа:

"when \n the\n clock\n strikes\n ten\n"

на лету я бы построил их динамически:

%w[when the clock strikes ten].join("\n ")
=> "when\n the\n clock\n strikes\n ten"

Объединение конечного "\n" добавит возвращаемый возврат каретки:

%w[when the clock strikes ten].join("\n ") + "\n"
=> "when\n the\n clock\n strikes\n ten\n"

Если я имею дело с подстроками, которые имеют встроенные пространства, я бы отредактировал массив:

['when the', 'clock strikes', 'ten'].join("\n ") + "\n"
=> "when the\n clock strikes\n ten\n"