2009-11-18 6 views
38

체크 아웃이 코드와 출력루비에서 어떻게 작동하는지 확인

def lab 
    yield 
    ensure 
    puts 'in ensure block' 
    true 
end 

puts lab { puts 'inside inline block'; false } 

output is 
#inside inline block 
#in ensure block 
#false 

블록이 실행 된 후 보장이 실행될 것이고 확실한 결과가 true를 반환하기 때문에 메서드 호출의 최종 출력이 'true'가 될 것으로 예상했습니다.

답변

62

보장 블록의 반환 값은 무시됩니다. 이는 함수가 예상 한대로 수행 한 후 정리하고 적절한 값을 반환하기 만하면 정리하는 방법입니다. 함수의 다른 위치에 정리 코드를 복제 할 필요없이 여러 본문 return 문 (또는 raise 문)을 함수 본문의 다른 위치에 넣을 수 있기 때문입니다.

+17

와우. 루비는 굉장합니다. – Trip

+2

@Trip : 당신이 좋아하는 것을 기쁘게 생각합니다 - 전혀 루비 특유의 것이 아닙니다. 예외 처리 기능을 사용하는 대부분의 언어는 동일한 방식으로 작동합니다 (예 : Java, Python). C++은 규칙의 예외이지만 [ScopeGuard] (http://www.drdobbs.com/cpp/184403758)와 같이 소멸자와 함께 할 수있는 몇 가지 강력한 기능이 있습니다. –

-1

명시 적으로 true를 반환해야하는 것처럼 보입니다. ensure은 자동으로 마지막 값을 반환하지 않을 수 있습니다.

12

ensure이 암시 적 및 명시 적으로 모두 작동하는 방식에 대한 개요는 this blog post을 참조하십시오.

+0

좋은 블로그 게시물입니다. 그러나 저자는 반환이 언급되지 않는 한 반환 값은 무시된다는 점을 명시 적으로 언급하지 않았습니다. – Roger

+0

위대한 블로그 글. 확실히 읽을만한 가치가 있습니다. –

관련 문제