Инициализация хэша 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)

можно явно сделать это таким образом:

array.each { |num| numbers[num] = (numbers[num] || 0) + 1 }

вариант 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] }]

вероятно, есть лучший способ, если вы поиграете с ним.