TypeError: невозможно преобразовать String в Integer Error при использовании inject - PullRequest
0 голосов
/ 24 апреля 2011
[1,2,2,3].each.inject({}){|hash,e|
    hash[e.to_s]||=0
    hash[e.to_s]+=1
}

Возвращает

TypeError: can't convert String into Integer.

Ответы [ 4 ]

7 голосов
/ 24 апреля 2011

Возвращаемое значение блока используется в качестве объекта memo в следующем цикле, поэтому вам просто нужно убедиться, что блок возвращает hash.

[1,2,2,3].inject({}) do |hash,e|
  hash[e.to_s] ||= 0
  hash[e.to_s] += 1
  hash
end
4 голосов
/ 25 апреля 2011

В этом случае рассмотрите возможность использования group_by и count вместо:

arr = [1,2,2,3]
throwaway_hash = arr.group_by{|x| x}
result_hash = Hash[throwaway_hash.map{|value, values| [value, values.count]}]
# => {1=>1, 2=>2, 3=>1}
2 голосов
/ 24 апреля 2011

В этом случае довольно часто используется значение хеша по умолчанию Hash.new(..).

[1,2,2,3].each_with_object(Hash.new(0)){|e, hash| hash[e.to_s]+=1}
2 голосов
/ 24 апреля 2011

Если вы используете 1.9, вы можете использовать each_with_object вместо inject (обратите внимание на обратный порядок параметров):

[1,2,2,3].each_with_object({}) do |e, hash|
  hash[e.to_s]||=0
  hash[e.to_s]+=1
end 
#=> {"1"=>1, "2"=>2, "3"=>1}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...