Ответ 1
По умолчанию использование #[]
будет извлекать хеш-значение, если оно существует, и вернуть нуль, если оно не существует *.
Использование #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
.