以下是我记得的方式:
%Q/%q 用于字符串
%Q 用于双引号字符串(当一个字符串包含多个引号时很有用)。
不要这样做:
“I said \“Hello World\””
你可以做:
%Q{I said “Hello World”}
%q 用于单引号字符串(请记住,单引号字符串不支持字符串插值或转义序列,例如 \n。当我说“不支持”时,我的意思是单引号字符串将需要将转义序列处理为特殊字符,换句话说,转义序列将只是字符串字面量的一部分)
可以尝试这样做:
‘I said \’Hello World\’’
你可以做:
%q{I said 'Hello World'}
但请注意,如果您在字符串中使用转义序列,它将不会被处理,而是被视为一个字面上的反斜杠和n字符:
result = %q{I said Hello World\n}
=> "I said Hello World\\n"
puts result
I said Hello World\n
注意,字面上的 \n 没有被视为换行符,但使用 %Q 可以实现:
result = %Q{I said Hello World\n}
=> "I said Hello World\n"
puts result
I said Hello World
%W/%w 用于数组元素
%W 用于双引号括起来的数组元素。这意味着它支持字符串插值和转义序列:
不要这样做:
orange = "orange"
result = ["apple", "#{orange}", "grapes"]
=> ["apple", "orange", "grapes”]
你可以这样做:
result = %W(apple #{orange} grapes\n)
=> ["apple", "orange", "grapes\n"]
puts result
apple
orange
grapes
注意转义序列 \n 会导致在grapes后面有一个换行符。这不会发生在%w中。%w用于单引号数组元素。当然,单引号字符串不支持插值和转义序列。
可以这样做:
result = [‘a’, ‘b’, ‘c’]
你可以做:
result = %w{a b c}
但是当我们尝试这样做时,看看会发生什么:
result = %w{a b c\n}
=> ["a", "b", "c\\n"]
puts result
a
b
c\n
请记住,不要将这些结构与%x混淆(用于运行Unix命令的`反引号的替代品),%r(用于//正则表达式语法的替代品,当您在正则表达式中有很多/字符并且不想转义它们时非常有用),最后是%s(用于符号)。
%w
,您无需转义双引号,代码看起来更酷。使用%w
的两个好理由。 - oldergod