2009-10-12 10 views
15

Oto coś, co często przy programowaniu:budowlane ciągi wielo-line, programowo w Ruby

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

Czy jest jakiś lepszy sposób niż o << "\n" lub + "\n" na każdej linii? Wydaje się to dość nieefektywne.

Jestem zainteresowany rozwiązaniami Ruby, w szczególności. Myślę, że coś takiego

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

Odpowiedz

15

Byłby to jeden sposób:

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

możesz stracić zmienną: '[" pierwsza linia "," druga linia "]. join (" \ n ")' – jaredjacobs

9

Zastosowanie < < - operator:

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

To wygląda dość dobre (myślę, że jest to dokument TUTAJ), ale zachowuje spacje na początku linii. jakikolwiek sposób się go pozbyć? – Peter

+0

'code = << - CODE.gsub (/^\ s + /, '')' po którym następuje heredoc jak zwykle. –

+0

blisko, ale chcę, żeby zachował wcięcie ... to tylko * dodatkowe * spacje, które powinny zniknąć. Tak, znam obejście, ale jest brzydkie. – Peter

3

Oto sposób przedstawiony here:

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 

Osiąga się to za pomocą tego:

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 

Chyba pytanie o to: czy brak przenośności/obecność małpy łatanie zrobić to rozwiązanie złe.

+0

Zamiast konieczności wstawiania "|" prefiks dla każdej linii ORAZ także zmieniając klasę String, dlaczego nie używać po prostu "code <<" jak w mojej odpowiedzi. Możesz skrócić nazwę zmiennej "code", aby była "d". Jest to łatwe do zrozumienia i każdy programista Ruby powinien być w stanie to rozgryźć. – Jim

5

To będzie pracować dla ciebie tylko do osadzenia ... \ n”w swoich strun, przypuszczam Oto świetny sposób, aby to zrobić.

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

następnie

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" 

ten pozwoliłoby coś takiego:

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

lub nawet:

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

Jeśli chcesz zbudować blok tekstu, prostym sposobem na to jest użycie operatora%. Na przykład:

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

„kod” będzie wtedy

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

+1. Również dla tych, którzy czytają o tym, nie musisz używać% {string} ... każda postać zrobi. Na przykład łańcuch% -string- lub% ~ string ~ – kinofrost

0

Można umieścić tekst wielu linii w pliku i użyć ERB, aby go przetworzyć (uwaga ERB jest dołączony Ruby)

require 'erb' 

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

(ERB może zmiennymi z miejscem wiązania obiekt, który zapewnia dostęp do metod np i zmiennych, które są w posiadaniu przez inny obiekt. przez ustawienie na „wiązanie” wskazuje na sam siebie)

Dokumentacja here.

0

Co w tym złego:

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