我不确定在Hash#fetch
Hash#[]
上使用{{1}}的情况。是否有一个常见的场景可以很好地利用它?
答案 0 :(得分:23)
三个主要用途:
当值是强制性的时,即没有默认值:
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
答案 1 :(得分:6)
当您想要获取默认值或在密钥不存在时引发错误时,fetch
非常有用。通过将默认值设置为哈希值,仍然可以在没有fetch
的情况下执行此操作,但是使用fetch
,您可以在现场执行此操作。
答案 2 :(得分:0)
但是,你可以这样做:
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]
但不是用fetch:
arr.fetch(0) = "A" #=> unexpected '=', expecting end-of-input