我有一个Heredoc,其中我使用#{}
来插入一些其他字符串,但有一种情况下我也想在我的Heredoc中写入实际文本#{some_ruby_stuff}
,而不进行插值。是否有一种方法可以转义#{
。
我已经尝试过 "\",但没有成功。虽然它转义了#{}
,但也包含了“\”:
>> <<-END
#{RAILS_ENV} \#{RAILS_ENV}
END
=> " development \#{RAILS_ENV}\n"
我有一个Heredoc,其中我使用#{}
来插入一些其他字符串,但有一种情况下我也想在我的Heredoc中写入实际文本#{some_ruby_stuff}
,而不进行插值。是否有一种方法可以转义#{
。
我已经尝试过 "\",但没有成功。虽然它转义了#{}
,但也包含了“\”:
>> <<-END
#{RAILS_ENV} \#{RAILS_ENV}
END
=> " development \#{RAILS_ENV}\n"
如果你想使用heredoc而无需手动转义所有可能的插值,你可以使用单引号形式的heredoc。其用法如下:
item = <<-'END'
#{code} stuff
whatever i want to say #{here}
END
我认为反斜杠和井号只是Ruby在某些仅限于irb的方式下表现出的“有帮助”的特性。
>> a,b = 1,2 #=> [1, 2]
>> s = "#{a} \#{b}" #=> "1 \#{b}"
>> puts s #=> 1 #{b}
>> s.size #=> 6
所以我认为你已经有了正确的答案。
'
代替双引号,引号内的内容不会被插值。#
的解决方案同样有效。实际上Ruby解释器显示=> "\#{anything}"
> puts "\#{anything}"
#{anything}
=> nil
p
方法用转义字符显示它。实际上,p
方法向你展示了,如何编写字符串来精确地表示其参数所代表的对象。
"\#{anything}" == '#{anything}'
没有插值,生成的字符串实际上不包含反斜杠。irb
只是显示一个反斜杠,因为它使用了String#inspect
。尝试使用puts <<END
查看(未经检查的)字符串。 - rampion