2014-04-28 1 views
0

다음은 주어진 전자 메일 주소가 전자 메일 클래스 속성의 '수신자 :'수신자 배열의 일부인지 확인하는 루비 코드입니다. 코드에서 목록에 email_address이 있으면 true를 반환하고 그렇지 않으면 false를 반환해야합니다.중첩 루프에서 Ruby 기능이 'true'로 중단되지 않는 이유는 무엇입니까?

def is_to_receiver?(email_address) 
    if @raw_email.to != nil 
    @raw_email.to.each do |to_field| 
     if to_field == email_address 
     true 
     else 
     next 
     end 
    end 
    end 
    false 
end 

나는 항상 라인 5 true 즉시 기능을 깨고 진정한 가치와 기능을 돌려 것이라고 생각했다. 그러나 일치하는 전자 메일 주소에 대한 결과는 11 호선에서 false으로 유지되었습니다.이 작업을 수행하려면 5 호선을 return true으로 변경해야했습니다.

코드를 Ruby 1.8.7에서 Ruby 1.9.3으로 마이그레이션했습니다. 이전에 잘 작동했는지 꽤 확신했습니다. Ruby 1.9.3 이후 단순히 실수를하거나이 동작이 변경된 것이 궁금합니다. 모든 답장을 환영합니다!

+1

이 동작을 기대하는 이유는 단순히 없습니다입니다. –

+1

'true' 대신에'return'을 사용하십시오 .. –

+0

이것은 결코 효과가 없었을 것입니다. – sevenseacat

답변

3

Ruby 메서드에서 return 문이없는 경우 Ruby는 마지막으로 실행 된 명령문의 값을 반환합니다. 그렇지 않으면, 리터럴이있는 명령문은 기본적으로 no-ops입니다. 루프의 중간에서 사용되면 마지막 명령문이 절대로 실행되지 않으므로 리턴되지 않습니다 (루프 처리와 관련된 다른 명령문이 실행되어야 함).

다른 식으로 말하면, 묵시적 반환 동작은 함수의 끝에 만 발생하지만 (조금 지나치게 단순화되었지만이 컨텍스트에서 작동 함) 다른 곳에서는 return 키워드를 사용해야합니다.

2

동작이 변경되지 않았으므로,이 경우 return true을 사용해야합니다.

그러나 당신은 당신의 방법을 리팩토링에 의해 명시 적으로 반환 방지 할 수 있습니다

def is_to_receiver?(email_address) 
    Array(@raw_email.to).include? email_address 
end 
+0

스테판 감사합니다! 나는 당신의 제안을 Windor C의 제안과 결합하여 이것을 oneliner로 대체했습니다. –

관련 문제