2010-12-22 2 views
3

이 코드가 배열 내의 요소 만 삭제하는 이유는 무엇입니까? for 루프는 각 값 0부터 3까지 반복하고 각 요소를 한 번에 하나씩 삭제합니다. 하지만 [0]과 [2] 만 삭제합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? "delete_at"메서드 짝수 배열 요소 만 삭제합니다.

UPDATE--

advance--

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"] 
감사드립니다 답변 주셔서 감사합니다; 나는 지금 내가하고있는 것을보고있다. 배열의 각 요소를 삭제하려면 Array 메서드 'shift'가 적절할 것입니다. 예 :

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

이렇게하면 첫 번째 요소가 배열 밖으로 이동하고 후속 요소가 한 셀 앞으로 이동합니다. 'each'를 사용하도록 권장 해 주셔서 감사합니다. 기본 문법임을 알 수 있습니다.

UPDATE 2--

코드의 다음 섹션 적절한 루비 구를보다 잘 나타내는 있을까?

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

그리고 글렌에게 배열의 내용 삭제에 대한 제안을 해주신 것에 감사드립니다.

+1

업데이트 코드는 Ruby 방식으로 작성되지 않았습니다. 'each'는'[1,2,3] .each {| n |}와 같이 배열에 대한 반복자입니다. p n}', for 루프의 변수가 아닙니다. –

+0

"코드의 다음 섹션이 올바른 루비 구문을 더 잘 나타낼까요?" 사실, 그렇지 않습니다. 작동하지 않기 때문입니다. 스크립트로 또는 IRB에 코드를 입력하여 코드를 실행 해 보았습니까? –

+0

예; 나는 IRB와 .rb에서 시도해 보았고 두 가지 방법으로 작동한다. 이전 예제와 같은 배열을 사용했습니다.빈 배열을 남겨두고 네 개의 요소를 모두 삭제해야합니다. 대안으로 무엇을 제안합니까? – shellAdept

답변

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 
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에있는 요소를 삭제하려고입니다하지만 배열은 인덱스 2 개 요소로 구성되어 있습니다 0 및 1이다.

PS. for을 사용하지 마십시오. 대신 each을 사용하십시오. "Ruby 지향"입니다.

2

음, 피 라스와 시몬은 정해진 질문에 대답,하지만 경우에 당신은 정말 당신이 함께 배열의 모든 요소를 ​​삭제할 수 있습니다, 효과적으로 삭제를 수행하는 방법이었다 알고 싶어 무엇을 :

a.clear 

a.slice!(0..3) 

어떤 경우이든 반복 할 필요가 없습니다.