Метод "delete_at" удаляет только четные элементы массива - PullRequest
3 голосов
/ 23 декабря 2010

Почему этот код удаляет только четные элементы в массиве? Я ожидаю, что цикл for будет перебирать каждое значение от 0 до 3 и удалять каждый элемент по одному. Но это только удаление [0] и a [2]. Что я делаю неправильно? Заранее спасибо -

a=%w(ant bat cat dog)
puts a.inspect #output: ["ant", "bat", "cat", "dog"]

for k in (0..3)
    a.delete_at(k)
end

puts a.inspect #output: ["bat", "dog"]

UPDATE -

Спасибо за ваши ответы; Я вижу, что я делал сейчас. Чтобы удалить каждый элемент массива, подойдет метод Array 'shift'. Например:

for each in (0..3)
    a.shift
    print a
end

Это сместит первый элемент из массива и переместит каждый последующий элемент на одну ячейку вперед. Спасибо за рекомендацию использовать «каждый» - я вижу, что это предпочтительный синтаксис.

ОБНОВЛЕНИЕ 2 -

Будет ли следующий раздел кода более представительным для правильного синтаксиса рубина?

(0..3).to_a.each do
    a.shift
    p a
end

И спасибо Гленну за предложения по удалению содержимого массива.

Ответы [ 3 ]

6 голосов
/ 23 декабря 2010

Потому что при удалении элемента 0 элемент 1 будет элементом 2 исходного массива.

Initially:
[ant, bat, cat, dog]

a.delete_at[0] => ant
[bat, cat, dog]

go to next element -> 1

a.delete_at[1] => cat
[bat, dog]

go to next element -> 2
a.delete_at[2] => nil (out of range)

go to next element -> 3
a.delete_at[3] => nil
5 голосов
/ 23 декабря 2010

Поскольку вы удаляете массив на месте и в третий раз выполнение входит в цикл, ваш массив короче значения k.

Попробуйте выполнить

a=%w(ant bat cat dog)
puts a.inspect #output: ["ant", "bat", "cat", "dog"]

for k in (0..3).to_a
  p k
  a.delete_at(k)
  p a
end

puts a.inspect #output: ["bat", "dog"]

Вот вывод

0
["bat", "cat", "dog"]
1
["bat", "dog"]
2
["bat", "dog"]
3
["bat", "dog"]

Когда k равен 2, вы пытаетесь удалить элемент с индексом 2, но ваш массив состоит только из 2 элементов с индексами 0 и 1.

PS. Избегайте использования for. Вместо этого используйте each, «более ориентированный на Ruby».

2 голосов
/ 23 декабря 2010

Ну, Firas и Simone ответили на заданный вами вопрос, но в случае, если вы действительно хотели узнать, как сделать это удаление эффективно, вы можете удалить все элементы из массива с помощью:

a.clear

и вы можете удалить диапазон элементов с помощью

a.slice!(0..3)

Нет необходимости повторять в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...