2009-08-21 12 views
10

Mam heredoc gdzie używam #{} do interpolacji niektórych innych ciągów znaków, ale jest też przypadek, w którym chcę napisać tekst rzeczywisty #{some_ruby_stuff} w moim heredoc, BEZ interpolacji . Czy istnieje sposób na ucieczkę od # {.Jak mogę uniknąć # {z interpolacji ciągów znaków

Próbowałem "\", ale bez powodzenia. Mimo że ucieka #{}, zawiera również „\”:

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

Odpowiedz

17

Myślę, że backslash-hash jest po prostu Ruby jest pomocne w pewien sposób tylko irb.

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

Więc myślę, że masz już poprawną odpowiedź.

+0

Masz rację. irb był "pomocny". Thx – Nick

4

' można użyć zamiast cytatów. Wszystko w nich zawarte nie jest interpolowane.

Twoje rozwiązanie z obsługą # również działa dla mnie. Rzeczywiście interpreter Ruby pokazuje

=> "\#{anything}" 

ale

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

ciąg zawiera dokładnie to, czego chciał, tylko p metoda pokazuje go ze znaków ewakuacyjnych. W rzeczywistości metoda p pokazuje, jak napisać łańcuch, aby uzyskać dokładnie obiekt reprezentowany przez jego parametr.

+0

Być może nie byłem wystarczająco jasny - to jest w heredoc. Zaktualizowałem ten przykład, aby lepiej to odzwierciedlić. – Nick

+1

to samo nadal obowiązuje. '" \ # {anything} "== '# {anything}'' Brak interpolacji, a wygenerowany łańcuch nie zawiera odwrotnego ukośnika. 'irb' wyświetla tylko jeden, ponieważ używa' String # inspect'. Spróbuj 'puts << END', aby zobaczyć (niezapowiedziany) ciąg znaków. – rampion

18

Dla heredoc, bez konieczności ręcznego ucieczki od wszystkich potencjalnych interpolacji, można użyć pojedynczego cudzysłowu. Działa to tak:

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

To jest naprawdę właściwa odpowiedź, przynajmniej w moim przypadku. – Rob

Powiązane problemy