如何在字符串插值中转义“#{}”?

13

我有一个Heredoc,其中我使用#{}来插入一些其他字符串,但有一种情况下我也想在我的Heredoc中写入实际文本#{some_ruby_stuff},而不进行插值。是否有一种方法可以转义#{

我已经尝试过 "\",但没有成功。虽然它转义了#{},但也包含了“\”:

>> <<-END
 #{RAILS_ENV} \#{RAILS_ENV} 
END
=> " development \#{RAILS_ENV}\n"
3个回答

21

如果你想使用heredoc而无需手动转义所有可能的插值,你可以使用单引号形式的heredoc。其用法如下:

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

19

我认为反斜杠和井号只是Ruby在某些仅限于irb的方式下表现出的“有帮助”的特性。

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

所以我认为你已经有了正确的答案。


4
你可以使用单引号'代替双引号,引号内的内容不会被插值。
对于我来说,你使用转义符号#的解决方案同样有效。实际上Ruby解释器显示
=> "\#{anything}"

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

你的字符串包含了你想要的内容,只是 p 方法用转义字符显示它。实际上,p 方法向你展示了,如何编写字符串来精确地表示其参数所代表的对象。

也许我没有表达清楚 - 这是在一个heredoc中。我已经更新了示例以更好地反映这一点。 - Nick
1
同样的规则仍然适用。"\#{anything}" == '#{anything}' 没有插值,生成的字符串实际上不包含反斜杠。irb 只是显示一个反斜杠,因为它使用了 String#inspect。尝试使用 puts <<END 查看(未经检查的)字符串。 - rampion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接