2016-09-14 1 views
0

Ruby에서 일부 코드의 동작을 이해하는 데 문제가 있습니다. 내 2D 배열의 내용을 특정 1d 배열과 일치시키고 싶다.Ruby : 특정 1d 배열과 같지 않은 경우 2 차원 배열에서 항목을 삭제하십시오.

s = [[1, 2], [2, 1], [2, 3], [3, 1], [3, 3]] 

나는 초보자와 나는 기본 뭔가를 내려다해야합니다 : 내가 이해하지 못하는 것을

s = [1,2,3].repeated_permutation(2).to_a 
solution = [3,1] 
s.each do |x| 
    if x != solution 
     puts s.length 
     print "#{x}\n" 
     s.delete(x) 
    end 
end 

이 코드는 다음을 반환 할 것입니다.

s = [1,2,3].repeated_permutation(2).to_a 
solution = [3,1] 

s.each_with_index do |x,idx| 
    if x != solution 
     s[idx] = nil 
    end 
end 

=> [nil,nil,nil,nil,nil,nil,nil,[3,1],nil] 

s.flatten!.compact! 

=> [3,1] 

는 사람이 검사를 수행 할 수있는 좋은 루비 방법이 될 것입니다 무엇을 말해 줄 수 : 나는 확실히 적합하지 않은 방법으로 우회하여이 문제를 극복 했습니까? 미리 감사드립니다.

+0

'each'는's '의 원소를 지우고, 원래의 9 원소의 원소 4 개를 길이 5의's'를 남깁니다. –

답변

2

당신이 찾고있는 것은 사실 Enumerable#detect입니다 :

[[1, 2], [2, 1], [2, 3], [3, 1], [3, 3]].detect { |e| e == [3, 1] } 
#⇒ [3, 1] 

코드는 전체 배열이 Enumerable#each 반복자가 수신기 자체를 반환한다는 것입니다 반환 이유. 열거 프로세스 중에 열거 형을 변경하는 것은 좋지 않습니다. 예기치 않은/예기치 않은 결과가 발생할 수 있습니다. 기본 배열이 변경 될 때 each이 제대로 작동하지 않습니다.

2

블록 평가에 따라 배열에서 값을 선택하는 데 사용할 수있는 .select 메서드를 살펴보십시오. 이것은 solution 배열과 일치하는, 예컨대 s의 요소를 포함하는 배열을 반환

s.select { |arry| arry == solution } 

예 : [[3,1]]

관련 문제