2013-04-05 9 views
17

Dire che volevo avere un blocco molto grande di codice html piuttosto stampato stretto in linea con il mio codice rubino. Qual è il modo più pulito per farlo senza perdere alcuna formattazione nella mia stringa o dover ricordare una sorta di regex di gsub.C'è un modo semplice per creare stringhe con rientro multilinea in Ruby?

Codifica tutto in una sola riga è facile da fare, ma difficile da leggere:

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 

testo multilinea in Ruby è più facile da leggere, ma la corda non può essere rientrato con il resto del codice:

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

Per esempio il seguente è rientrato con il mio codice, ma la stringa ora ha quattro spazi aggiuntivi di fronte a ogni riga:

1.times do 
    doc = <<-EOM 

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

La maggior parte delle persone utilizza il codice HEREDOC sopra riportato e sostituisce il risultato con un regex per eliminare gli spazi bianchi aggiuntivi all'inizio di ogni riga. Mi piacerebbe un modo in cui non devo passare attraverso il problema di regexing ogni volta.

+1

Partenza - http://stackoverflow.com/questions/3350648/ruby-indented-multiline-strings – theglauber

+1

Inoltre - http: // StackOverflow.it/questions/3772864/how-do-i-remove-leading-whitespace-chars-from-ruby-heredoc – theglauber

+0

'Ho una stringa (" quando \ n l'orologio \ n colpisce \ n dieci \ n ") sarebbe molto più pulito se potesse essere digitato con caratteri di nuova riga. "Non ha senso. '" \ n "' sono veri caratteri di nuova riga. –

risposta

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

Here è un blog con alcuni esempi di %q{}, %Q{} e altri.

Per quanto sia facile da ricordare, pensare a "Q" per "Virgolette".

Sidenote: Tecnicamente non è necessario il 'q' mentre si fa quotazione.

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

Tuttavia, è meglio la pratica e più leggibile da usare %Q{}.

+1

'+ 1' per il collegamento del blog. :) –

+0

Mi piace% q {},% Q {} e% {}. Comunque voglio che la stringa sia rientrata con il mio codice. Ho riscritto la mia domanda in modo che sia più chiara. –

3

Non è molto ovvio quello che stai chiedendo. Se avessi voluto per generare stringhe come:

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

al volo, mi piacerebbe costruirli in modo dinamico:

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

Concatenating un trailing "\n" aggiungerà la finale di ritorno a capo:

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

Se si tratta di stringhe secondarie con spazi incorporati, sistemo l'array su:

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

Hai ragione, la domanda era difficile da capire. L'ho riscritto. Spero sia più facile da capire ora. –

15

Dal Rubino 2.3, i <<~ strisce heredoc principali spazi contenuti:

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

puts make_doc('hello') 

Per le vecchie versioni di Ruby, il seguente è più dettagliato rispetto alle soluzioni presentate nelle altre risposte, ma non c'è quasi nessun sovraccarico delle prestazioni. Si tratta di veloce come un'unica lunga stringa letterale:

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