irb 转义双引号的行为

irb's behavior for escaping double quotes

IRB 内部:

"\'" 

returns "'",但是

"\""

returns "\"",即和输入一样,没有转义双引号。将它与 puts 一起使用按预期工作,但为什么以这种方式尝试时它不起作用?

irb 运行良好。你不能指望它输出 """.

根据定义:

an escape character is a character which invokes an alternative interpretation on subsequent characters in a character sequence.

在你预期的输出中 """ 显然中间 " 有不同的解释。因此它被逃脱了。

为了让事情更清楚:

"\""
#=> "\""
puts "\""
# "

IRB在语句执行后默认使用Object#inspect来显示语句的结果。

String#inspect 的情况下,文档说

Returns a printable version of str, surrounded by quote marks, with special characters escaped.

irb(main):001:0> "\""
=> "\""
irb(main):002:0> '"'
=> "\""

启动IRB时,你可以传递--noinspect选项,在这种情况下,irb将使用to_s打印结果。

例如,如果我们有一个 class:

class Test
    def to_s
        "#{self.class} instance"
    end
end

默认 IRB:

irb(main):003:0> Test.new
=> #<Test:0x00000002ad7fa8>

irb --noinspect

irb(main):002:0> Test.new
=> Test instance
irb(main):003:0> "\""
=> "
irb(main):004:0> '"'
=> "
irb(main):005:0>