2012-03-13 2 views
5

The Ruby Programming Languagep.164에 따라. begin 문은 예외를 전파하지 않는 경우시작 블록의 값은 어떻게 결정됩니까?

는, 값 명령문의 는 begin, rescue 또는 else 절에서 평가의 마지막 표현의 값입니다. 및 을 보장

하지만이 과 일치하는이 동작을 찾을 함께 다른 절 블록을 시작합니다.

def fact (n) 
    raise "bad argument" if n.to_i < 1 
end 

value = begin 
    fact (1) 
rescue RuntimeError => e 
    p e.message 
else 
    p "I am in the else statement" 
ensure 
    p "I will be always executed" 
    p "The END of begin block" 
end 

p value 

출력은 :

"I am in the else statement" 
"I will be always executed" 
"The END of begin block" 
"I am in the else statement" 
[Finished] 

valueelse 절로 평가되고 여기서

은 코드 예이다. 확정 절인이 실행 된 마지막 명령문이므로 일관성없는 동작입니다.

누군가가 시작 블록에서 무슨 일이 일어 났는지 설명 할 수 있습니까?

+0

"코드 블록이 실행 된 마지막 문에 대해 평가됩니다." 이것은 분명히 잘못된 가정입니다. –

+0

죄송합니다. 더 구체적인 진술 및 참고 문헌으로 수정하십시오. – steveyang

+2

이제 스스로 질문에 대답했습니다. "시작, 구조 또는 기타"는 실제로 올바른 순서이므로 이것은 사양과 일치합니다. –

답변

4

나는 목표를 해석하려는로 begin/rescue/else/end 블록 :

  • else 섹션에 다음 코드를 begin 섹션에있는 코드를 실행합니다.
  • begin 섹션에 문제가있는 경우 else 섹션 대신 rescue 섹션을 실행하십시오.

그래서 중 하나rescue 섹션 또는 else 섹션은 begin 섹션을 시도한 후에 실행됩니다; 그 중 하나가 전체 블록의 가치로 사용된다는 것은 의미가 있습니다.

이것은 단지 ensure 섹션이 항상 실행된다는 부작용입니다.

val = begin 
    p "first"; "first" 
rescue => e 
    p "fail"; "fail" 
else 
    p "else"; "else" 
ensure 
    p "ensure"; "ensure" 
end 

val # => "else" 
# >> "first" 
# >> "else" 
# >> "ensure" 

그러나이 : ​​

val = begin 
    p "first"; "first" 
    raise 
rescue => e 
    p "fail"; "fail" 
else 
    p "else"; "else" 
ensure 
    p "ensure"; "ensure" 
end 

val # => "fail" 
# >> "first" 
# >> "fail" 
# >> "ensure" 
0

저는 여기에서 추측하고 있습니다.하지만 확실한 블록의 목적은 열린 상태로 유지 될 수있는 리소스 (즉, 정리)를 마무리하는 것이므로 논리 값이 else 문. 그것이 나에게 의미가 있습니다.

0

이 경우 begin 블록은 예외 처리를 수행하려는 섹션을 정의하는 방법 일뿐입니다.

이 경우 else은 예외가 발생하지 않으면 실행되고 ensure은 예외 또는 부족에 관계없이 실행됩니다.

관련 문제