Преимущества использования `Hash # fetch` над` Hash # [] `

Я не уверен, в какой ситуации я бы хотел использовать Hash#fetch над Hash#[]. Есть ли общий сценарий, в котором он будет полезен?

Ответ 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
    

Ответ 2

Если вы хотите получить значение по умолчанию или вызвать ошибку, когда ключ не существует, полезно использовать fetch. Это можно сделать без fetch, установив значение по умолчанию для хэша, но используя fetch, вы можете сделать это на месте.

Ответ 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