Ruby 2.5新增KeyError#receiver和KeyError#key

95 阅读1分钟

Ruby 2.5新增KeyError#receiver和KeyError#key

最近,Ruby 2.5.0发布了。

早期的Ruby 1.9Hash#fetch 方法会对一个无效的键引发IndexError 。当给定的索引值无效时,会引发IndexError

irb(main):001:0> hash = { 'foo' => 'bar' }
irb(main):002:0> hash.fetch('foo')
IndexError: key not found
    from (irb):2:in `fetch'
    from (irb):2
    from :0

KeyError 在Ruby 1.9中引入了 类,它继承于 类。当指定的键没有被找到时,它被引发。IndexError

>> hash = {foo: :bar}
=> {:foo=>:bar}
>> hash.fetch(:baz)
KeyError: key not found: :baz
	from (irb):2:in `fetch'
	from (irb):2
	from /home/atul/.rvm/rubies/ruby-2.4.4/bin/irb:11:in `<main>'

有人建议KeyError#receiverKeyError#name (或KeyError#key) 像NameError一样,将有助于调试和查找did_you_mean gem上的错误:

begin
  h = {foo: 1, bar: 2}
  h.fetch(:bax)
rescue KeyError => e
  p e.name     #=> :bax
  p e.receiver #=> {foo: 1, bar: 2} equal `h`
  end

会议讨论了在namekey 之间使用什么方法名称最好。Benoit Daloze建议,name 与其他错误类如NameError#nameNoMethodError#name 更加一致。将key 作为方法名被批准。

Ruby 2.5.0

Ruby 2.5.0提供了KeyError#receiverKeyError#key 作为方法来返回未找到的接收器对象和键的详细信息:

begin
  h = { foo: 1, bar: 2}
  h.fetch(:bax)
rescue KeyError => e
  p e.key      #=> :bax
  p e.receiver #=> {foo: 1, bar: 2}
end

我希望这些方法在你未来的调试尝试中是有用的。