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 不再具有相同的回溯.
我只是想在表中添加一些内容: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)