2009-10-12 10 views
15

Ecco qualcosa che faccio spesso durante la programmazione:costruzione stringhe multilinea, a livello di codice, in Ruby

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

C'è qualche modo di meglio che avere << "\n" o + "\n" su ogni linea? Questo sembra abbastanza inefficiente.

Sono interessato alle soluzioni Ruby, in particolare. Sto pensando qualcosa di simile

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

risposta

15

Questo sarebbe un modo:

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

si può perdere la variabile: '[" prima riga "," seconda riga "]. join (" \ n ")' – jaredjacobs

9

Usa < < - operatore:

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

Questo sembra piuttosto buono (credo che sia un documento QUI), ma conserva lo spazio bianco all'inizio delle righe. un modo per sbarazzartene? – Peter

+0

'code = << - CODE.gsub (/^\ s + /, '')' seguito da heredoc come al solito. –

+0

chiudi, ma voglio che mantenga il rientro anche ... è solo lo * spazio in più * che dovrebbe essere sparito. sì, conosco una soluzione, ma è brutta. – Peter

3

Ecco un metodo presentato 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 

Questo si ottiene utilizzando questo:

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 

Credo che la domanda di questo è: non la mancanza di portabilità/presenza di scimmia patch rendono questa soluzione male.

+0

Invece di dover mettere un "|" prefisso per ogni riga E anche cambiando la classe String, perché non usare solo "codice <<" come nella mia risposta. Puoi abbreviare il nome della variabile 'code' per essere 'd'. È facile da capire e qualsiasi programmatore di Ruby dovrebbe essere in grado di capirlo. – Jim

5

che avrebbe funzionato per voi solo embed ... \ n" nelle stringhe, suppongo Ecco un modo divertente per farlo:.

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

poi

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" 

Questo permetterebbe qualcosa come:

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

O anche:

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

Se stai cercando di creare un blocco di testo, il modo più semplice per farlo è utilizzare l'operatore%. Per esempio:

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

'codice' sarà poi

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

+1. Inoltre, per chi sta leggendo su questo non è necessario usare% {string} ... qualsiasi personaggio lo farà. Ad esempio% -string- o% ~ string ~ – kinofrost

0

Si potrebbe inserire il vostro testo su più righe in un file, e utilizzare ERB per analizzarlo (nota ERB è incluso con Ruby)

require 'erb' 

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

(ERB può accedere alle variabili da un binding, un oggetto che fornisce accesso ai metodi istanza e variabili che sono di proprietà da un altro oggetto. impostando su "binding" che punta a se stesso)

Documentazione here.

0

Cosa c'è di sbagliato con:

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