2009-08-21 9 views
10

Tengo un heredoc donde estoy usando #{} para interpolar algunas otras cadenas, pero hay una instancia en la que también quiero escribir el texto actual #{some_ruby_stuff} en mi heredoc, SIN que esté interpolado . ¿Hay alguna manera de escapar del # {.¿Cómo escapo # {de la interpolación de cadena

Lo he intentado con "\", pero no tuve suerte. A pesar de que escapa a la #{}, sino que también incluye el "\":

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

Respuesta

17

Creo que el backslash-hash es solo que Ruby es útil de alguna manera irb.

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

Así que creo que ya tienes la respuesta correcta.

+0

Tienes razón. irb estaba siendo "útil". Thx – Nick

4

Puede utilizar ' cotizaciones en su lugar. Cualquier cosa encerrada en ellos no se está interpolando.

Su solución con escape # también me funciona. De hecho intérprete de Ruby muestra

=> "\#{anything}" 

pero

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

Su cadena incluye exactamente lo que quería, sólo se p método muestra con caracteres de escape. En realidad, el método p muestra cómo se debe escribir una cadena para obtener exactamente el objeto representado por su parámetro.

+0

Quizás no estaba lo suficientemente claro, esto está dentro de un heredoc. He actualizado el ejemplo para reflejarlo mejor. – Nick

+1

lo mismo sigue siendo válido. '" \ # {anything} "== '# {anything}'' Sin interpolación, y la cadena generada en realidad no contiene una barra diagonal inversa. 'irb' solo muestra uno porque está usando' String # inspect'. Pruebe 'puts << END' para ver la cadena (no inspeccionada). – rampion

18

Para heredoc sin tener que escanear manualmente todas sus interpolaciones potenciales, puede usar single-quote-style-heredoc. Funciona así:

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

Esta es realmente la respuesta correcta, al menos para mi caso. – Rob

Cuestiones relacionadas