【问题标题】:How do I escape #{ from string interpolation如何从字符串插值中转义 #{
【发布时间】:2010-11-21 14:16:23
【问题描述】:

我有一个heredoc,我在其中使用#{} 插入一些其他字符串,但有一个实例我还想在我的heredoc 中写入实际文本#{some_ruby_stuff},而不对其进行插值。有没有办法逃脱#{。

我试过“\”,但没有运气。虽然它转义了#{},但它也包含了“\”:

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

【问题讨论】:

    标签: ruby-on-rails ruby interpolation


    【解决方案1】:

    对于heredoc,无需手动转义所有可能的插值,您可以使用单引号样式-heredoc。它的工作原理是这样的:

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

    【讨论】:

      【解决方案2】:

      我认为反斜杠哈希只是 Ruby 以某种 irb-only 方式提供帮助。

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

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

      【讨论】:

        【解决方案3】:

        您可以改用' 引号。包含在其中的任何内容都不会被插值。

        您转义# 的解决方案也适用于我。确实 Ruby 解释器展示了

        => "\#{anything}"
        

        但是

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

        你的字符串包含你想要的,只有p 方法用转义字符显示它。实际上,p 方法向您展示了应该如何编写字符串以获取由其参数表示的确切对象。

        【讨论】:

        • 也许我不够清楚 - 这是在heredoc中。我已经更新了示例以更好地反映这一点。
        • 同样如此。 "\#{anything}" == '#{anything}' 没有插值,生成的字符串实际上不包含反斜杠。 irb 只显示一个,因为它使用的是String#inspect。尝试puts &lt;&lt;END 查看(未经检查的)字符串。
        猜你喜欢
        • 2012-01-26
        • 1970-01-01
        • 2020-11-05
        • 1970-01-01
        • 1970-01-01
        • 2013-05-28
        • 2011-02-09
        • 2020-09-26
        • 1970-01-01
        相关资源
        最近更新 更多