Инициализация хэша Ruby (значение по умолчанию nil)
Я читал документы Ruby и смотрел на некоторые другие сообщения по этому вопросу, но мне все еще интересно об этом:
#counts each number in an array once
array = [1,1,2,5,3,2,5,3,3,3]
numbers = {}
array.each { |num| numbers[num] += 1 }
=> in `block in mode': undefined method `+' for nil:NilClass (NoMethodError)
на хэш документации значение по умолчанию Hash
is nil
, вот почему я получаю эту ошибку, я предполагаю. Есть ли лучший способ вставить каждый ключ/(значение += 1) в массив чисел?
5 ответов
попробуйте передать по умолчанию значение для вашего нового хэша как такового
numbers = Hash.new(0)
Вы можете создать хэш, который использует 0
в качестве значения по умолчанию такой:
numbers = Hash.new(0)
вариант inject
и Hash.new(0)
numbers = [1,1,2,5,3,2,5,3,3,3].inject(Hash.new(0)){|numbers, number| numbers[number] +=1; numbers}
Помимо использования хэша по умолчанию, вы также можете попробовать что-то с group_by
:
array = [1,1,2,5,3,2,5,3,3,3]
numbers = Hash[*array.group_by { |i| i }.flat_map { |k, v| [k , v.size] }]
вероятно, есть лучший способ, если вы поиграете с ним.