2014-02-12 4 views
2

"만일"나는 루비 인터프리터 변수를 할당하는 방법에 대한 질문이루비 변수 할당 수정

some_method 객체 또는 전무를 반환
return foo if (foo = bar.some_method) 

. 그러나

, 나는이 시도 :

return foo if (true && (foo = bar.some_method)) 

내가 얻을 : 나가서 설명하자면 NameError : 개체 : 주에 대한 정의되지 않은 지역 변수 또는 메소드 foo는.

두 번째 줄의 오류를 유발하는 첫 번째 줄과 두 번째 줄 사이의 차이점은 무엇입니까?

+2

두 번째 변형에서 지정이 단락 될 것이기 때문에. 그러나 meh, 이것이 가독성에 도움이되는 패턴인지 확신 할 수 없습니다. –

답변

7

Read it carefully :

개질제를 사용하는 경우 경우 다른 통상적 혼란 경우이다

p a if a = 0.zero? 

보다는 true를 인쇄하면 나가서 설명하자면 NameError 수신 "정의되지 않은 로컬 변수 또는 방법 'A'". 이후 Rubyif의 맨 왼쪽 a을 구문 분석하고 아직 지정을 보지 못했습니다. 메소드를 호출하기를 원합니다. Ruby는 지정이에서 a으로 표시되고 local method을 참조한다고 가정합니다.

혼란은의 순서가 잘못되어 실행되는 에서 비롯됩니다. 먼저 로컬 변수가 할당됩니다. 존재하지 않는 메소드를 호출하려고 시도합니다.

당신이 말했듯이 - 없음 return foo if (foo = bar.some_method)return foo if (true && (foo = bar.some_method)) 내가 당신을 내기 작동하지 않습니다이 줄 앞에 foo를 정의하지 않은 경우, 그것이 작동하지 않을 것입니다.

+2

젠장, 나는이 질문을 삭제했다! 내가 이것을 테스트 할 때 이미 irb에 foo를 정의했다는 것을 알린 직후에 나는 깨달았다. 나는 다른 사람들이 배워야 할 나의 정오에 대한 증거를 남겨 둘 것입니다. 대답 해줘서 고마워. – jz999