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