пятница, 18 января 2013 г.

Создание хешей с помощью Hash.new


Сначала о различиях синтаксиса в руби версии 1.8 и 1.9

hash1 = { :key => 'value' } #стандартный синтаксис
hash2 = { key: 'value' } #новый синтаксис в 1.9
hash3 = { key: :value } #особенно удобно в новом синтаксисе хранить ключи
view raw hashes1.rb hosted with ❤ by GitHub
Создание пустого хеша
empty_hash = {}
empty_hash = Hash.new
view raw hashes2.rb hosted with ❤ by GitHub
Проблема с Hash.new в том, что нельзя хеш сразу заполнить значениями, как при первом способе. Для чего же тогда используется этот синтаксис? Ответ состоит в том, что с помощью Hash.new можно установить значение по умолчанию для несуществующих ключей.
counter = Hash.new(0) # => {}
counter[:monkey] += 1 # => 1
counter[:monkey] += 2 # => 2
counter # => {:monkey => 3}
view raw hashes3.rb hosted with ❤ by GitHub
Сравните это со следующим
counter = {} # => {}
counter[:monkey] += 1 # Ошибка! NoMethodError: undefined method `+' for nil:NilClass
view raw hashes4.rb hosted with ❤ by GitHub

Таким образом, хеши, созданные с помощью фигурных скобок, имеют значение по умолчанию nil.
В каких случаях удобно использовать Hash.new? Например, для возврата кодов HTTP
STATUS_MESSAGES = Hash.new(:undefined).merge({
200 => :ok,
201 => :created,
202 => :accepted
}
STATUS_MESSAGES[200] # => :ok
STATUS_MESSAGES[999] # => :undefined
view raw hashes5.rb hosted with ❤ by GitHub
Теперь вместо nil возвращается :undefined, что выглядит более ясно.

Комментариев нет:

Отправить комментарий