От Ruby Koans about_hashes.rb
:
Почему вы можете использовать #fetch
вместо #[]
при доступе к хеш-ключам?
От Ruby Koans about_hashes.rb
:
Почему вы можете использовать #fetch
вместо #[]
при доступе к хеш-ключам?
По умолчанию использование #[]
будет извлекать хеш-значение, если оно существует, и вернуть нуль, если оно не существует *.
Использование #fetch
дает вам несколько вариантов (см. документы # fetch):
fetch(key_name)
: получить значение, если ключ существует, поднять KeyError
, если он неfetch(key_name, default_value)
: получить значение, если ключ существует, вернуть default_value
иначеfetch(key_name) { |key| "default" }
: получить значение, если ключ существует, в противном случае запустить поставляемый блок и вернуть значение.Каждый из них должен использоваться по мере необходимости, но #fetch
очень многофункциональный и может обрабатывать многие случаи в зависимости от того, как он используется. По этой причине я предпочитаю его использовать для доступа к клавишам с #[]
.
* Как сказал Марк-Андре Лафортун, доступ к ключу с помощью #[]
вызовет #default_proc
, если он существует, или вернет #default
, который по умолчанию равен nil
. Подробнее см. запись doc для ::new
.
С []
создатель хеша управляет тем, что происходит, когда ключ не существует, с fetch
вы делаете.
fetch
по умолчанию вызывает ошибку, если ключ не найден. Вместо этого вы можете указать значение по умолчанию.
h = {}
h.fetch(:foo) # no default value, raises error
# => # ~> -:3:in `fetch': key not found: :foo (KeyError)
h.fetch(:bar, 10) # default value, returns default value
# => 10