我想使用带有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)
正如已经指出的那样,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问题上有一些很好的答案,可以参考这种语法的不同用法.
| 归档时间: |
|
| 查看次数: |
4610 次 |
| 最近记录: |