2013-04-30 3 views
1

각자에게 전달 된 블록 내에있는 for-loop 내에서 Ruby의 각 반복자로 돌아갈 수 있는지 궁금합니다.For 루프에서 각 반복자로 돌아 가기

def find member = "" 

     productHash = {} 

      #@entries is a hash, with both the keys and values being strings 
      #the member parameter is a string 

     @entries.each do |key, value| 

      for i in 0...member.size 

       if(key[i] != member[i]) 
        next #the next keyword doesn't work...all it does is return to the for iterator. I'm looking for a keyword that would return to the each iterator, and allow each to pass back in the next key-value pair. 
       end 

      end 

      productHash[key] = value 


     end 

     productHash 

end 

는 내가 달성 노력하고있어 이것이다 : 나는 멤버 매개 변수에 문자가 지정된 키에 해당하는 문자를 일치하지 않음을 보는 순간, 나는 다음 키 - 값 쌍으로 이동 .

+2

이 왜 루프를 사용하고 있습니까? 블록을 사용하여 각 방법을 사용하는 것이 어떻습니까? – jason328

+0

@ jason328 어떻게 도움이 될까요? 이 문제는 여전히 내가 생각하는 것과 같을 것이다. 그리고 여기서 for 루프를 사용하는 이유는 매개 변수 "member"의 해당 문자와 ​​비교할 목적으로 인덱스 번호를 추적 할 수 있기 때문입니다. 내 생각에 개념적으로 내 질문은 return 문 (break, next, return과 같은)이 for 루프 반복자와 각 반복자를 구분하는지 여부입니다. – voltair

+0

질문을 이해하는 데 어려움을 겪고 있습니다. 'each_with_index'를 사용하면 도움이 될까요? – jason328

답변

1

키가 특정 접두사와 일치하는 경우 member으로 지정하면 할당을 수행하는 것처럼 보입니다.

이 코드는 기능적으로 유사해야합니다 :

def find(member = "") 
    hash = { } 

    @entries.each do |key, value| 
    # Unless key begins with prefix, skip it. 
    next unless (key[0, prefix.length] == prefix) 

    hash[key] = value 
    end 

    hash 
end 

가 루비의 공식 goto 문 없다, 이것은 좋은 일이지만, 중첩 된 블록에서 파열하는 것은 조금 까다로운 일이 될 수 있다는 것을 의미 주장 할 것이다 많은 .

그래도 올바른 방법으로 문제에 접근하면 거의 항상 유익한 해결책이 있습니다.

업데이트 :

가 중첩 루프에서 탈출하기 위해, 접근 방식이 될 수 있습니다

list.each do |i| 
    broken = false 

    inner_list.each do |j| 
    if (j > 10) 
     broken = true 
     break 
    end 
    end 

    break if (broken) 
end 
+0

정말 고마워요! 그냥 확인하기 위해 for 루프 내에서 코드 내 각 반복자로 빠져 나갈 수있는 방법이 없습니까? – voltair

+0

솔직히 말해서 루비를 사용 해본 사람들을 제외하고 루비에서는'for'를 사용하지 않습니다. 'each' 반복자 또는 Enumerable의 다른 것이 대신 사용됩니다. 두 단계를 벗어나기 위해, 'return'은 보통 메소드를 종료 할 수 있다면 트릭을 수행합니다. 대안으로, 플래그와 'break'를 설정 한 다음 해당 조건이 설정되면 다시 'break'를 설정하십시오. – tadman

+0

나는 짧은 예를 들어 나의 답을 수정했다. – tadman

관련 문제