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#receiver 和KeyError#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
会议讨论了在name 和key 之间使用什么方法名称最好。Benoit Daloze建议,name 与其他错误类如NameError#name 和NoMethodError#name 更加一致。将key 作为方法名被批准。
Ruby 2.5.0
Ruby 2.5.0提供了KeyError#receiver 和KeyError#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
我希望这些方法在你未来的调试尝试中是有用的。