Может ли кто-нибудь показать мне рубиновый способ проверки наличия ключа в хеше, и если он не даст ему значение по умолчанию. Я предполагаю, что есть один лайнер, если только не делать этого, но я не уверен, что использовать.
Если ключ не существует, создайте значение по умолчанию
Ответ 1
Если у вас уже есть хеш, вы можете сделать это:
h.fetch(key, "default value")
Или вы используете тот факт, что несуществующий ключ вернет nil
:
h[key] || "default value"
Для создания хэшей со значениями по умолчанию это зависит от того, что вы хотите сделать точно.
-
Независимо от ключа и не будет сохранено:
h = Hash.new("foo") h[1] #=> "foo" h #=> {}
-
Зависит от ключа и будет сохранен:
h = Hash.new { |h, k| h[k] = k * k } h[2] #=> 4 h #=> {2=>4}
Ответ 2
Конструктор класса Hash принимает значение по умолчанию, то же самое будет возвращено, если соответствующий ключ не найден.
h = Hash.new("default")
h.has_key?("jake")
=> false
h["jake"]
=> "default"
h["jake"] = "26"
h.has_key?("jake")
=> true
Ответ 3
Если вам не нужно сохранять это значение по умолчанию в хэш, вы можете использовать метод Hash#fetch
:
hash = {}
hash.fetch(:some_key, 'default-value') # => 'default-value'
p hash
# => {}
Если вам нужно дополнительно сохранить значение по умолчанию каждый раз, когда вы обращаетесь к несуществующему ключу, и вы инициализируете хэш, вы можете сделать это, используя Hash#new
с блоком:
hash = Hash.new { |hash, key| hash[key] = 'default-value' }
hash[:a] = 'foo'
p hash[:b]
# => 'default-value'
p hash
# => { :a => 'foo', :b => 'default-value' }
Ответ 4
Если вы сохраняете значение по умолчанию, которое может быть nil, и вам нужно рассчитать его во время хранения:
hash = {}
...
hash.fetch(key) {|k| hash[k] = calc_default()}
Ответ 5
Вы можете использовать оператор ||=
:
hash = {some_key: 'some_value'}
puts hash[:some_key] ||= 'default_value' # prints 'some_value'
puts hash[:non_existing_key] ||= 'default_value' # prints 'default_value'
puts hash.inspect # {:some_key=>"some_value", :non_existing_key=>"default_value"}