“delete_at”方法仅删除偶数数组元素

时间:2010-12-22 22:52:14

标签: arrays ruby

为什么此代码只删除数组中的元素?我希望for循环遍历每个值0到3,并一次删除一个元素。但它只删除了[0]和[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

这会将第一个元素移出数组,并将每个后续元素向前移动一个单元格。感谢您推荐使用'each' - 我可以看到它是首选语法。

更新2 -

以下代码部分是否更能代表正确的ruby语法?

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

感谢Glenn关于删除数组内容的建议。

3 个答案:

答案 0 :(得分:6)

因为当你删除元素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

答案 1 :(得分:5)

因为您正在删除数组,并且第三次执行进入循环,所以您的数组比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"]

k2时,您试图删除索引2处的元素,但您的数组仅由索引为0和1的2个元素组成。

PS。避免使用for。相反,使用each是“更加面向Ruby”。

答案 2 :(得分:2)

好吧,Firas和Simone已经回答了您提出的问题,但是如果你真正想知道的是如何有效地删除这些内容,你可以删除数组中的所有元素:

a.clear

您可以使用

删除一系列元素
a.slice!(0..3)

无论如何都不需要迭代。