Ruby HEREDOC语法解释字符串

0xC*_*ABE 6 ruby

我想使用带有HTML页面的irb进行一些小的正则表达式测试,我正试图解决这个问题.

但是,我们都知道并喜欢的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
Run Code Online (Sandbox Code Playgroud)

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

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

tor*_*o2k 15

你不能把字符串放在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"
Run Code Online (Sandbox Code Playgroud)

这是因为你可以这样写:

irb> instance_eval(<<-CODE)
irb* def foo
irb*   "foo"
irb* end
irb* CODE
Run Code Online (Sandbox Code Playgroud)

甚至:

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"]
Run Code Online (Sandbox Code Playgroud)


Cha*_*ell 6

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

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

text = %q{ <a class="foo"> }
text = ' <a class="foo"> '
Run Code Online (Sandbox Code Playgroud)

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

text = %Q{ <a class="#{class_name}">}
Run Code Online (Sandbox Code Playgroud)

您也可以关闭{}其他终结器.以下两行给出完全相同的输出:

text = %Q[ <a class="#{class_name}">] 
text = %Q| <a class="#{class_name}">|
Run Code Online (Sandbox Code Playgroud)

它们支持多行:

text = %q{<p>
Some text
</p>}
Run Code Online (Sandbox Code Playgroud)

这个SO问题上有一些很好的答案,可以参考这种语法的不同用法.