Подтвердить что ты не робот

Fetch vs. [] при работе с хэшами?

От Ruby Koans about_hashes.rb:

Почему вы можете использовать #fetch вместо #[] при доступе к хеш-ключам?

4b9b3361

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

Ответ 2

С [] создатель хеша управляет тем, что происходит, когда ключ не существует, с fetch вы делаете.

Ответ 3

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