我不知道在什么情况下,我想用Hash#fetch
了Hash#[]
有没有在这将是很好地利用一种常见的情形?
Answer 1:
三个,主要用途:
当该值是强制性的,即不存在默认:
options.fetch(:repeat).times{...}
你得到一个不错的错误信息太:
key not found: :repeat
当值可以是
nil
或false
,默认是别的东西:if (doit = options.fetch(:repeat, 1)) doit.times{...} else # options[:repeat] is set to nil or false, do something else maybe end
当你不想使用
default
/default_proc
散列:options = Hash.new(42) options[:foo] || :default # => 42 options.fetch(:foo, :default) # => :default
Answer 2:
如果你想获得一个默认值或提高时,键不存在,错误fetch
是非常有用的。 它仍然是可以这样做,而不fetch
由默认值设定为哈希,但使用fetch
,你可以做到这一点当场。
Answer 3:
但是,你可以这样做:
arr = [1,2,3]
arr[1..-2] #=> [1,2]
但不是这样的:
arr.fetch(1..-2) #=> TypeError: no implicit conversion of Range into Integer
类似地,可以发生变异与阵列Hash#[]
arr[0] = "A"
arr #=> ["A",2,3]
但不能与获取:
arr.fetch(0) = "A" #=> unexpected '=', expecting end-of-input
文章来源: Benefits of using `Hash#fetch` over `Hash#[]`