Вставка значения в массив внутри хеша

Я некоторое время работал над этим кодом для радикальной сортировки. Казалось, что все идет хорошо, пока я не попытаюсь вставить значение в массив в хэше. Я получаю сообщение об ошибке, что значение равно 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
Другие вопросы по тегам