2009-08-21 35 views
10

我有一個heredoc,我正在使用#{}來插入其他字符串,但有一個實例,我也想在我的heredoc中寫入實際文本#{some_ruby_stuff},而不插入它。有沒有辦法逃避#{。我如何逃避#{從字符串插值

我試過「\」,但沒有運氣。雖然逃脫#{},還包括「\」:

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

回答

17

我認爲反斜槓散列只是Ruby在一些irb唯一的方式有幫助。

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

所以我認爲你已經有了正確的答案。

+0

你說得對。 irb正在「有幫助」。 Thx – Nick 2009-08-21 10:00:09

4

您可以使用'引號代替。其中包含的任何內容都不會被插入。

您的解決方案與轉義#也適用於我。事實上,Ruby解釋器顯示

=> "\#{anything}" 

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

你的字符串包含你想要什麼,只p法轉義字符顯示它。實際上,p方法告訴你,應該如何寫入字符串來獲取由其參數表示的確切對象。

+0

也許我還不夠清楚 - 這是在heredoc內。我已經更新了這個例子以更好地反映這一點。 – Nick 2009-08-21 08:34:18

+1

一樣仍然成立。 ''\#{anything}「=='#{anything}''沒有插值,生成的字符串實際上並不包含反斜槓。 'irb'只顯示一個,因爲它使用'String#inspect'。嘗試'puts << END'來查看(未經審查的)字符串。 – rampion 2009-08-21 09:24:02

18

對於heredoc而言,您無需手動轉義所有可能的插值,您可以使用單引號樣式heredoc。它的工作原理是這樣的:

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

這真的是正確的答案,至少在我的情況下。 – Rob 2013-09-18 16:18:29