2014-01-19 4 views

답변

3

안전하지 않습니다. 기본 컨테이너를 반복하는 동안은 변경하지 마십시오. 이로 인해 예기치 않은 동작이 발생할 수 있습니다.

a = [1] 
a.each { a.push 1 } 

당신의 코드가 Array#delete_if를 사용하여 작성할 수 있습니다 :

array1 = [5, 4, 3, 1, 2, 7, 8] 
min = 4 
array1.delete_if { |arrayElement| 
    arrayElement < min 
} 
array # => [5, 4, 7, 8] 
예를 들어

는, 다음 코드는 무한 루프가 발생합니다

3

아니요. 이터레이터는 대개 컬렉션이 그 아래에서 변경 될 것을 기대하지 않으므로 안전하지 않은 작업입니다. 반복자의 구현에 따라 일부 요소를 두 번 이상 가져 오거나 일부 요소가 전혀 표시되지 않습니다.

원본 배열이 아닌 복사본을 반복 (또는 수정)해야합니다.

1

min의 콘텍스트가 누락되었지만 delete_if 메서드를 사용 해본 적이 있습니까?

예 : array1.delete_if { |x| x < min }

http://www.ruby-doc.org/core-2.1.0/Array.html#method-i-delete_if에서 :

블록이 true로 평가하는 자기의 모든 요소를 ​​삭제합니다.

배열이 반복 될 때마다 블록이 호출 될 때마다 즉시 변경됩니다.

관련 문제