Построение многострочных строк программно в Ruby - PullRequest
17 голосов
/ 12 октября 2009

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

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

Ответы [ 7 ]

29 голосов
/ 12 октября 2009

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

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

тогда «код» будет

"First line\n second line\n Third line 4"
18 голосов
/ 12 октября 2009

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

code = []
code << "next line of code #{something}"
code << "another line #{some_included_expression}"
code.join("\n")
9 голосов
/ 12 октября 2009

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

code = <<-CODE
var1 = "foo"
var2 = "bar"
CODE
5 голосов
/ 12 октября 2009

Было бы неплохо, если бы вы просто встраивали ... \ 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"
3 голосов
/ 12 октября 2009

Вот метод, представленный здесь :

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

Я предполагаю, что вопрос с этим: делает ли переносимость / наличие исправлений обезьяны плохим решение?

1 голос
/ 24 марта 2015

Что не так с:

code = "next line of code #{something}\n"+
       "another line #{some_included_expression}"
0 голосов
/ 04 июля 2014

Вы можете поместить многострочный текст в файл и использовать 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, объекта, который обеспечивает доступ к методам экземпляра и переменным, принадлежащим другому объекту. Установив для него значение "binding", он указывает на себя)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...