使用`Hash #fetch`优于`Hash#[]`的好处

时间:2013-01-30 01:24:44

标签: ruby hash

我不确定在Hash#fetch Hash#[]上使用{{1}}的情况。是否有一个常见的场景可以很好地利用它?

3 个答案:

答案 0 :(得分:23)

三个主要用途:

  1. 当值是强制性的时,即没有默认值:

    options.fetch(:repeat).times{...}
    

    你也得到一个很好的错误信息:

    key not found: :repeat
    
  2. 当值为nilfalse时,默认值为其他值:

    if (doit = options.fetch(:repeat, 1))
      doit.times{...}
    else
      # options[:repeat] is set to nil or false, do something else maybe
    end
    
  3. 如果您不想使用哈希的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