2013-04-10 2 views
1

저는 Ruby를 사용하는 Proj Euler를 통해 프로그래밍 및 작업에 새로운 것을 알았습니다. 왜 루비 루프가 깨지지 않을까요? 나는 if 문에 무엇을 넣어왜이 루비는 각 루프가 깨지지 않습니까?

(1..5).each do |a| 
    (1..5).each do |b| 
    e=(a*a)+(b*b) 
    c=Math.sqrt(e) 
    puts "a=#{a}, b=#{b}, c=#{c}" 
    break if a+b+c == 12 
    end 
end 

참고 경우는 잘 작동, 그냥 그건

+0

내부 범위 루프에 있으며이 범위를 벗어나지 만 외부 루프가 계속됩니다. – squiguy

+2

[Ruby에서 외부주기를 깨는 방법?] (http://stackoverflow.com/questions/1352120/how-to-break-outer-cycle-in-ruby) – pduersteler

+0

질문이 혼란 스럽습니다. 우리 터미널에서 코드를 실행하는 이유는 무엇입니까? 오히려 출력을 여기에 제공 할 수 있으며 예상치 못한 동작을 발견하고 예상되는 출력을 확인해야합니다. –

답변

3

을 중단하지 않습니다 (예를 들어 풋 경우 A + B + C == 12 "은 발견") 정상적인 이유는 b의 루프에서만 break입니다.


이 작업을 수행하는 올바른 방법 (루프가 a에가는 계속하는)이 질문에 설명되어 있습니다 : How to break outer cycle in ruby

1

아래의 코드 당신이 때 휴식

(1..5).each do |a| 
    break unless (1..5).each do |b| 
    e=(a*a)+(b*b) 
    c=Math.sqrt(e) 
    puts "a=#{a}, b=#{b}, c=#{c}" 
    break if a+b+c == 12 
    end 
end 

를 수행 할 작업을 할 수있다 이 루프에서 트리거되면 루프의 반환 값은이 경우 nil 인 중단 값이됩니다. 그렇지 않은 경우 (1..5)이 리턴됩니다. 그래서이 코드가 작동합니다.

1

다른 말로, break은 내부 루프 만 종료합니다.

이 같은 예를 들어, 코드를 다시 작성할 수 : 예상대로 이제

[*1..5].product([*1..5]).map{|a, b| [a, b, Math.sqrt(a*a+b*b)]}.each do |a, b, c| 
    puts "a=#{a}, b=#{b}, c=#{c}" 
    break if a + b + c == 12 
end 

, break가 작동합니다.

관련 문제