Benefits of using `Hash#fetch` over `Hash#[]`

后端 未结 3 677
花落未央
花落未央 2021-02-12 11:15

I am not sure in what situation I would want to use Hash#fetch over Hash#[]. Is there a common scenario in where it would be of good use?

3条回答
  •  星月不相逢
    2021-02-12 12:01

    Three main uses:

    1. When the value is mandatory, i.e. there is no default:

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

      You get a nice error message too:

      key not found: :repeat
      
    2. When the value can be nil or false and the default is something else:

      if (doit = options.fetch(:repeat, 1))
        doit.times{...}
      else
        # options[:repeat] is set to nil or false, do something else maybe
      end
      
    3. When you don't want to use the default/default_proc of a hash:

      options = Hash.new(42)
      options[:foo] || :default # => 42
      options.fetch(:foo, :default) # => :default
      

提交回复
热议问题