Создание многострочных строк, программно, в Ruby

Здесь что-то я часто делаю при программировании:

code = ''
code << "next line of code #{something}" << "\n"
code << "another line #{some_included_expression}" << "\n"

Есть ли лучший способ, чем << "\n" или + "\n" в каждой строке? Это кажется довольно неэффективным.

В частности, меня интересуют решения Ruby. Я думаю что-то вроде

code = string.multiline do
  "next line of code #{something}"
  "another line #{some_included_expression}"
end

Ответы

Ответ 1

Это будет один из способов:

code = []
code << "next line of code #{something}"
code << "another line #{some_included_expression}"
code.join("\n")

Ответ 2

Если вы хотите создать блок текста, простой способ сделать это - просто использовать оператор%. Например:

code = %{First line
second line
Third line #{2 + 2}}

'code' будет

"First line\n second line\n Third line 4"

Ответ 3

Используйте < -оператор:

code = <<-CODE
var1 = "foo"
var2 = "bar"
CODE

Ответ 4

Похоже на то, что вы просто вставляете... \n "в свои строки. Это интересный способ сделать это:

class String
  def / s
    self << s << "\n"
  end
end

затем

f = ""           # => ""
f / 'line one'   # => "line one\n"
f / 'line two'   # => "line one\nline two\n"
f / 'line three' # => "line one\nline two\nline three\n"

Это позволит включить что-то вроде:

"" / "line 1" / "line 2" / "line 3" # => "line 1\nline 2\nline 3\n"

Или даже:

f/
"line one"/
"line two"/
"line three"     # => "line one\nline two\nline three\n"

Ответ 5

Здесь представлен метод здесь:

str = <<end.margin
  |This here-document has a "left margin"
  |at the vertical bar on each line.
  |
  |  We can do inset quotations,
  |  hanging indentions, and so on.
end

Это достигается с помощью этого:

class String
  def margin
    arr = self.split("\n")             # Split into lines
    arr.map! {|x| x.sub!(/\s*\|/,"")}  # Remove leading characters
    str = arr.join("\n")               # Rejoin into a single line
    self.replace(str)                  # Replace contents of string
  end
end

Я предполагаю, что вопрос заключается в следующем: неужели переносимость/наличие патчей обезьян затрудняет это решение.

Ответ 6

Вы можете разместить многострочный текст в файле и использовать ERB для его анализа (обратите внимание, что ERB включен в Ruby)

require 'erb'

multi_line_string = File.open("multi_line_string.erb", 'r').read
template = ERB.new(multi_line_string)
template.result(binding)

(ERB может обращаться к переменным из Binding, объекта, который предоставляет доступ к методам экземпляра и переменным, принадлежащим другому объекту. Установив его в "привязку", он указывает на себя)

Документация здесь.

Ответ 7

Что случилось с:

code = "next line of code #{something}\n"+
       "another line #{some_included_expression}"