查看一些文档,我看到了使用百分比文字定义的多行字符串:
command %Q{
do this;
do that;
}
过去,当我需要多行字符串时,我总是使用heredoc:
command <<-heredoc
echo "stuff" | do stuff;
heredoc
它们之间有什么语义差异?我有什么理由想要使用%Q而不是heredoc吗?
答案 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
可以是多行或单行%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
使用哪个问题取决于您是否需要插值以及转义字符的便利性。例如:
''
或%q()
%Q()