【问题标题】:Ruby HEREDOC syntax interprets stringRuby HEREDOC 语法解释字符串
【发布时间】:2013-06-09 21:59:26
【问题描述】:

我想使用 irb 和我正在尝试 gsub 的 HTML 页面进行一些正则表达式测试。

然而,我们都知道和喜爱的 HEREDOC 语法在 Ruby 中似乎有所不同:

irb(main):140:0> text = <<-FUNUNU <p class="firstpara">
irb(main):141:0" FUNUNU
irb(main):142:0*
irb(main):143:0* puts text
SyntaxError: compile error
(irb):140: syntax error, unexpected kCLASS, expecting kDO or '{' or '('
text = <<-FUNUNU <p class="firstpara">
                         ^
(irb):143: syntax error, unexpected tIDENTIFIER, expecting kDO or '{' or '('
        from (irb):143
        from :0

它似乎在抱怨字符串的内容,试图解释它。从我能找到的关于 HEREDOC 语法的所有文档中,都指出关键字之间的所有内容都应该是变量的一部分。但似乎并非如此。

除了 HEREDOC 字符串以 HEREDOC 指示符的第二个表达式结尾之外,字符串的内容是否有格式限制?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    heredoc 的第一行允许额外的 ruby​​。字符串在回车后开始。

    http://ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/syntax.html#here_doc

    【讨论】:

      【解决方案2】:

      你不能把字符串放在heredoc分隔符的同一行,因为在分隔符之后,在同一行,可以放Ruby代码,即

      irb> text = <<-FOO # Ruby code allowed here...
      irb*   <a class="foo">
      irb* FOO
      # => "<a class=\"foo\">\n" 
      irb> text
      # => "<a class=\"foo\">\n"
      

      这是因为你可以这样写:

      irb> instance_eval(<<-CODE)
      irb* def foo
      irb*   "foo"
      irb* end
      irb* CODE
      

      甚至:

      def foo(a, b, c)
        [a, b, c]
      end
      
      foo(<<-A, <<-B, <<-C)
      foo
      A
      bar
      B
      baz
      C
      # => ["foo\n", "bar\n", "baz\n"]
      

      【讨论】:

      • 我现在可以看到了。这是“分隔符之后的所有行”中的一个陷阱,而不是分隔符中的所有内容。谢谢。
      【解决方案3】:

      正如已经指出的那样,heredoc 文本在heredoc 终止符之后的下一行开始。这并不是要取代那些答案,而是为典型的 heredoc 语法提供一个可能更好的替代方案。

      我个人更喜欢使用%q{}。它等同于使用单引号。以下给出相同的输出:

      text = %q{ <a class="foo"> }
      text = ' <a class="foo"> '
      

      如果你想使用字符串插值:

      text = %Q{ <a class="#{class_name}">}
      

      您也可以将{} 换成其他终结器。以下两行给出完全相同的输出:

      text = %Q[ <a class="#{class_name}">] 
      text = %Q| <a class="#{class_name}">|
      

      而且它们支持多行:

      text = %q{<p>
      Some text
      </p>}
      

      this SO question 上有一些关于此语法的不同用途的好答案。

      【讨论】:

      • 感谢您的建议。
      猜你喜欢
      • 1970-01-01
      • 2015-11-06
      • 2016-01-15
      • 2022-12-22
      • 2021-01-04
      • 1970-01-01
      • 2019-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多