2009-05-15 3 views
5

return 키워드가 'if block'에서 문제를 일으키는 이유는 무엇입니까?

다음 코드는 잘 작동합니다.

person = {:a=>:A, :b=>:B, :c=>:C} 
berson = {:a=>:A1, :b=>:B1, :c=>:C1} 

kerson = person.merge(berson) do | key, oldv, newv | 
if key == :a 
    oldv 
elsif key == :b 
    newv 
else 
    key 
end 
end 

puts kerson.inspect 
return을 "if block"안에 추가하면 오류가 발생합니다.

person = {:a=>:A, :b=>:B, :c=>:C} 
berson = {:a=>:A1, :b=>:B1, :c=>:C1} 

kerson = person.merge(berson) do | key, oldv, newv | 
if key == :a 
    return oldv 
elsif key == :b 
    return newv 
else 
    return key 
end 
end 

puts kerson.inspect 
위의 코드에서 오류가 발생했습니다 :

unexpected return (LocalJumpError) 

누구든지 이것을 설명 할 수 있습니까? return은 반환 값의 가정이 이미있는 곳이라면 선택적으로 사용할 수 있다고 생각했습니다.

답변

12

오류의 원인은 블록이 자신이 반환 한 범위가 실제로 없다는 것입니다. 블록에서 반환하는 것은 주변의 메서드에서 반환하는 것과 같습니다. 주변 방법은 무엇입니까? 아무 것도 없습니다. 최상위 수준에 있으므로 ruby -e "return"을 수행하는 것과 같습니다. 그러면 동일한 오류가 발생합니다. 이것을 메소드 내부에 찔러 넣으면 메소드는 실행되는 if 절의 첫 번째 분기 값을 리턴합니다.

관련 문제