Я не уверен, в какой ситуации я бы хотел использовать 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