Согласно документации, #delete_at
возвращает элемент по этому индексу.
a = ["ant", "bat", "cat", "dog"]
a.delete_at(2) #=> "cat"
a #=> ["ant", "bat", "dog"]
a.delete_at(99) #=> nil
Я добавил некоторые отладочные, чтобы показать вам, что происходит на каждом шаге, предполагая, что предел составляет 4:
@results = [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1], [1, 1]]
@results.each_with_index do |r, i|
puts "RESULT: #{r.to_s}"
puts "INDEX: #{i}"
@results.delete_at(i) if r.size < 4
puts "ARRAY: #{@results.to_s}"
end
RESULT: [1, 1, 1, 1]
INDEX: 0
ARRAY: [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1], [1, 1]]
RESULT: [1, 1, 1, 1]
INDEX: 1
ARRAY: [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1], [1, 1]]
RESULT: [1, 1, 1]
INDEX: 2
ARRAY: [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1]]
# @results == [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1]]
Как вы можете видеть, элемент первоначально с индексом 2 был удален. Поскольку вы изменяете @results
во время итерации через него, индекс 3 больше не существует, и индекс 2 уже проанализирован. Вот почему вы не должны изменять объект во время итерации через него.
В идеале вы хотите использовать #delete_if
. Подобно методам, заканчивающимся на !
, #delete_if
будет изменять массив (не возвращать копию результата) на основе условий из блока (в качестве аргумента). Ниже будет как бы реализовать метод:
def check_results(limit)
@results.delete_if { |arr| arr.length < limit }
end
@results = [ ['foo', 'bar'], ['bizz', 'bazz'], ['kaboom'] ]
check_results(2)
# => @results == [ ['foo', 'bar'], ['bizz', 'bazz'] ]
Если вы не хотите, чтобы изменить @results
, то я предлагаю подобный метод, #reject
. Опять же, @results
не будет изменен, и вместо этого будет возвращена копия результатов.
def check_results(limit)
@results.reject { |arr| arr.length < limit }
end
@results = [ ['foo', 'bar'], ['bizz', 'bazz'], ['kaboom'] ]
check_results(2)
# => [ ['foo', 'bar'], ['bizz', 'bazz'] ]
# => @results == [ ['foo', 'bar'], ['bizz', 'bazz'], ['kaboom'] ]
Hello. Я отредактировал свой ответ, чтобы включить _why_, который вы испытываете. Я включил отладочные заявления. Пожалуйста, взгляните на это. Я также предлагаю альтернативы/решения вашей проблемы :-) – onebree