2009-08-21 17 views
10

Ich habe ein heredoc, wo ich #{} interpoliere einige andere Zeichenfolgen, aber es gibt eine Instanz, wo ich auch den tatsächlichen Text #{some_ruby_stuff} in meinem heredoc schreiben möchte, OHNE dass es interpoliert wird . Gibt es eine Möglichkeit, der # {zu entkommen.Wie fange ich # {von Stringinterpolation

Ich habe versucht "\", aber kein Glück. Obwohl es die #{} entweicht, enthält es auch das „\“:

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

Antwort

17

Ich denke, der Backslash-Hash ist nur Ruby, die in irgendeiner Weise nur hilfreich ist.

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

Also ich denke, Sie haben bereits die richtige Antwort.

+0

Sie haben Recht. irb war "hilfreich". Thx – Nick

4

Sie ' Anführungszeichen stattdessen verwenden können. Alles, was darin enthalten ist, wird nicht interpoliert.

Ihre Lösung mit der Flucht # funktioniert auch für mich. Tatsächlich Ruby-Interpreter zeigt

=> "\#{anything}" 

aber

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

Ihre Zeichenfolge enthält genau das, was Sie wollten, nur p Methode zeigt es mit Escape-Zeichen. Tatsächlich zeigt Methode Ihnen, wie Zeichenfolge geschrieben werden soll, um genau das Objekt zu erhalten, das durch seinen Parameter dargestellt wird.

+0

Vielleicht war ich nicht klar genug - das ist in einem heredoc. Ich habe das Beispiel aktualisiert, um das besser zu reflektieren. – Nick

+1

das gleiche gilt immer noch. '" \ # {anything} "== '# {anything}'' Keine Interpolation, und die generierte Zeichenfolge enthält keinen umgekehrten Schrägstrich. 'irb' zeigt nur eins an, da es' String # inspect' verwendet. Versuchen Sie 'puts << END', um die (nicht geprüfte) Zeichenkette zu sehen. – rampion

18

Für heredoc, ohne alle Ihre möglichen Interpolationen Hand-Escape, können Sie Single-Quote-Stil-Heredoc verwenden. Es funktioniert wie folgt:

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

Das ist wirklich die richtige Antwort, zumindest für meinen Fall. – Rob

Verwandte Themen