2009-08-21 17 views
10

Ho un heredoc dove sto utilizzando #{} interpolare alcune altre corde, ma c'è un caso in cui anche io voglio scrivere il testo effettivo #{some_ruby_stuff} nel mio heredoc, senza che sia interpolato . C'è un modo per sfuggire al # {.Come faccio a scappare # {da interpolazione stringa

Ho provato "\", ma senza fortuna. Anche se sfugge al #{}, include anche la "\":

>> <<-END 
#{RAILS_ENV} \#{RAILS_ENV} 
END 
=> " development \#{RAILS_ENV}\n" 

risposta

17

Penso che il backslash-hash sia solo in Ruby utile in qualche modo irb-only.

>> a,b = 1,2  #=> [1, 2] 
>> s = "#{a} \#{b}" #=> "1 \#{b}" 
>> puts s   #=> 1 #{b} 
>> s.size   #=> 6 

Quindi penso che avete già la risposta corretta.

+0

Hai ragione. irb è stato "utile". Thx – Nick

4

È possibile utilizzare ' apici invece. Tutto ciò che è racchiuso in essi non viene interpolato.

La soluzione con escape # funziona anche per me. Infatti Rubino interprete mostra

=> "\#{anything}" 

ma

> puts "\#{anything}" 
#{anything} 
=> nil 

La stringa comprende esattamente quello che volevi, solo p metodo mostra con caratteri di escape. In realtà, il metodo p mostra come deve essere scritta la stringa per ottenere esattamente l'oggetto rappresentato dal suo parametro.

+0

Forse non ero abbastanza chiaro - questo è all'interno di un heredoc. Ho aggiornato l'esempio per riflettere meglio. – Nick

+1

lo stesso vale ancora. '" \ # {anything} "== '# {anything}'' Nessuna interpolazione e la stringa generata in realtà non contiene una barra rovesciata. 'irb' ne mostra solo uno poiché usa' String # inspect'. Prova 'puts << END' per vedere la stringa (non corretta). – rampion

18

Per heredoc senza dover sfuggire a mano tutte le vostre potenziali interpolazioni, è possibile utilizzare heredoc a virgolette. Funziona così:

item = <<-'END' 
    #{code} stuff 
    whatever i want to say #{here} 
END 
+0

Questa è davvero la risposta giusta, almeno per il mio caso. – Rob

Problemi correlati