Gli here document sono quella parte della sintassi di ruby (ripresa da perl che ha sua volta la riprense dalle shell unix) che permette di inserire dei blocchi di codice lunghi enza preoccuparsi di fare l’escape dei contenuti.
Quindi invece di scriverefoo= "\bla bla \"bla\""potete usare la sintassi alternativa con i
%
foo = %{bla bla "bla"}notate che si sono usate delle parentesi graffe per delimitare il testo ma in realtà potete usare qualsiasi carattere, ad esempio scrivendo
foo= %| codice con {graffe} delimitato da pipe|Oppure potete usare la sintassi perl-like:
foo = <<Eot bla bla "bla" bl ... "foo" bar baz Eot
Eot sta in questo caso per “end of text” ma in realtà potete usare una qualsiasi parola, come ad esempio “FINE_TESTO”, o una qualsiasi parola che pensate non sia presente nel testo.
Se usata questa sintassi è necessario stare attenti al fatto che la parola che funge da delimitatore deve essere all’inizio di una linea, il che è brutto se la usate in un pezzo di codice indentato. Per far si che ruby consideri come delimitatore una parola anche se indentata si deve aggiungere un - all’inizio:
def foo x= <<-FINE ... FINE end
Questo però crea un altro sub problema: adesso vi trovate con un sacco di spazi prima del testo!
Finché si tratta di scuvaerescrivere codice che deve essere usato dall’interprete tramite eval() o simili questo va benissimo, ma se ad esempio dovete mostrarlo a schermo verrà fuori incasinato.
Un’ottima soluzione è usare String#margin() che è fornito dalla libreria Facets, e che è documentata in questa pagina