这个救援案例有什么问题?

Nor*_*wap 5 ruby exception rescue

x = StandardError.new(:hello)
y = StandardError.new(:hello)
x == y # => true
x === y # => true

begin
  raise x
rescue x
  puts "ok" # gets printed
end

begin
  raise x
rescue y
  puts "ok" # doesn't get printed
end
Run Code Online (Sandbox Code Playgroud)

为什么不打印第二个"ok"?我无法弄清楚.我在这里读到ruby使用===运算符来匹配例外以解救抢救条款,但表面上并非如此.

我正在使用Ruby 1.9.3

编辑:所以看起来就像这样raise x,x == y并且x === y不再持有.它似乎因为x并且y 不再具有相同的回溯.

kri*_*ard 1

我只是想在表中添加一些内容:OP 代码表明这两个异常是相同的,但它们不是 - 此外,我想说明 OP 的含义:

所以看起来在 raise x 之后, x == y 和 x === y 不再成立。似乎是因为 x 和 y 不再具有相同的回溯。

 x = StandardError.new(:hello)
 y = StandardError.new(:hello)
 class Object
   def all_equals(o)
     ops = [:==, :===, :eql?, :equal?]
     Hash[ops.map(&:to_s).zip(ops.map {|s| send(s, o) })]
   end
 end

 puts x.all_equals y # => {"=="=>true, "==="=>true, "eql?"=>false, "equal?"=>false}

 begin
   raise x
 rescue
   puts "ok" # gets printed
 end

 puts x.all_equals y # => {"=="=>false, "==="=>false, "eql?"=>false, "equal?"=>false}
Run Code Online (Sandbox Code Playgroud)