Ruby中百分比文字和herdocs之间的语义差异?

时间:2014-09-05 20:30:38

标签: ruby heredoc

查看一些文档,我看到了使用百分比文字定义的多行字符串:

command %Q{
    do this;
    do that;
}

过去,当我需要多行字符串时,我总是使用heredoc:

command <<-heredoc
    echo "stuff" | do stuff;
heredoc

它们之间有什么语义差异?我有什么理由想要使用%Q而不是heredoc吗?

3 个答案:

答案 0 :(得分:2)

我倾向于评估在决定使用哪个文本时使用了多少文本。

如果不是很多文字(例如,单行),我会使用%Q,例如%Q|foobar|%Q提供的值是,它允许您轻松混合引号,例如

%Q|"Get a Job" ~Mom's words|

当有很多跨越多行的文字时,我会使用&#34; heredoc&#34; s。

例如,假设您将大量文本粘贴到REPL中(如YAML文件的内容)。除非您遍历整个文件,否则您无法确定是否与您选择的%Q分隔符发生冲突。使用&#34; heredoc&#34;你只需使用一些非常模糊的文本,你相当肯定不会有冲突,例如。

<<-BatMobilePrettyObscure
... Lots of text ...
BatMobilePrettyObscure

据我所知,从语义上讲,只有一些小的差异:

  • %Q只能使用一个字符来分隔字符串
  • %Q可以是多行或单行
  • &#34; heredoc&#34; s必须是多行的,关闭&#34; heredoc&#34; 独自站立
  • %Q分隔符可以&#34; mashed&#34;反对他们的字符串,例如%Q|foobar|

答案 1 :(得分:1)

你可以使用heredocs一个时髦的技巧:第一行可以用作完整的字符串。例如,以下所有示例都是有效的Ruby代码:

puts(<<-EOS)
  Hello, world!
EOS

<<-EOS.upcase
  Hello, world!
EOS

puts(<<-EOS.upcase)
  Hello, world!
EOS

然而,你不会经常在野外发现。除此之外,它们与双引号字符串或%Q{}%{}文字相同,只是您可以选择多字符分隔符。当字符串中可能出现所有可能的百分比字面分隔符时,这会派上用场。这尤其适用于长串。

答案 2 :(得分:1)

没有真正的语义差异,也与多行字符串无关。 所有字符串在Ruby中都可以是多行的。这些都是相同的字符串:

'a
b
'

"a
b
"

%Q{a
b
}

<<-heredoc
a
b
heredoc

使用哪个问题取决于您是否需要插值以及转义字符的便利性。例如:

  1. 你需要插值吗?如果没有,则''%q()
  2. 是否会有很多引号字符可以逃脱?然后使用%Q()
  3. 您是否想在不考虑转义字符的情况下编写大量文本?使用heredocs。