Вставка значения в массив внутри хеша
Я некоторое время работал над этим кодом для радикальной сортировки. Казалось, что все идет хорошо, пока я не попытаюсь вставить значение в массив в хэше. Я получаю сообщение об ошибке, что значение равно nil, однако я проверил все значения, о которых идет речь, непосредственно перед тем, как пытаться сохранить их в массиве, и это все еще не позволяет мне сделать это. Есть идеи? buckets[sdigit].push(num) - это строка, которая сообщает мне, что одним из моих значений является nil.
arr = []
while arr.size < 100
arr.push(rand(1000))
end
for outer_index in arr
puts "for outer index(#{outer_index} in arr"
buckets = Hash.new()
puts "buckets = Hash.new()"
puts "for j in 0..9"
for j in 0..9
buckets[j.to_s] = Array.new()
#buckets[j.to_s] = [j]
puts "buckets[j.to_s(#{buckets[j.to_s]})"
end
for inner_index in arr
puts "for inner_index(#{inner_index}) in arr"
num = inner_index
puts "num(#{num}) = inner_index(#{inner_index})"
sdigit = num.to_s[-1]
puts "sdigit(#{sdigit}) = num.to_s[-1](#{num.to_s[-1]})"
digit = sdigit.to_i
puts "digit(#{digit}) = sdigit.to_i(#{sdigit.to_i})"
puts "buckets[digit] = #{buckets[sdigit]}"
puts "#{buckets["1"]}"
puts "o#{num}"
puts buckets
buckets[sdigit].push(num)
puts "buckets[digit].push(num)(#{buckets[digit].push(num)})"
end
arr = buckets.values.flatten
end `
1 ответ
buckets[sdigit].push(num) - это строка, которая сообщает мне, что одним из моих значений является nil.
Если вы посмотрите на сообщение об ошибке:
top.rb:30:in `block (2 levels) in <main>': undefined method `push' for nil:NilClass (NoMethodError)
и ваш код:
Вы видите, что строка 30 является puts
не buckets[sdigit].push(num)
,
Причина: существует несоответствие между значениями, отображаемыми puts
и те, которые используются выражением: [digit]
вместо [sdigit]
и это след, который вызывает ошибку.
Лично я пишу puts
трассирует перед оператором для трассировки, потому что он показывает значения, которые будут использоваться выражением перед оператором, который может вызвать ошибку. Обычно это помогает... кроме случаев, когда трассировка сама по себе ошибочна.
Я немного перестроил ваш код:
arr = []
100.times { arr << rand(1000) }
puts arr.join(', ')
arr.each do | outer_index |
puts "===== for outer_index=#{outer_index} in arr"
buckets = Hash.new()
puts "buckets = Hash.new()"
puts "for j in 0..9"
(0..9).each do | j |
buckets[j.to_s] = Array.new()
#buckets[j.to_s] = [j]
puts "buckets[#{j.to_s}]=#{buckets[j.to_s]}"
end
arr.each do | inner_index |
puts "----- for inner_index=#{inner_index} in arr"
num = inner_index
puts "num(#{num}) = inner_index(#{inner_index})"
sdigit = num.to_s[-1]
puts "sdigit(#{sdigit}) = num.to_s[-1](#{num.to_s[-1]})"
digit = sdigit.to_i
puts "digit(#{digit}) = sdigit.to_i(#{sdigit.to_i})"
puts "buckets[digit] = #{buckets[sdigit]}"
puts "#{buckets["1"]}"
puts "o#{num}"
puts buckets
puts "buckets[sdigit].push(num)=buckets[#{sdigit}].push(#{num})"
buckets[sdigit].push(num)
# puts "buckets[digit].push(num)(#{buckets[digit].push(num)})"
end
arr = buckets.values.flatten
end