2012-03-19 3 views
4

필자는 생각한 것을하지 않는 경우 인라인을 사용하고 명확성을 위해 콘솔 예제로 추출했습니다.테스트가 작동하면 왜 인라인되지 않습니까?

필자는 인라인 if 구문이 다중 줄 if와 동일하다고 생각했지만 그렇지 않은 것처럼 보입니다.

foo = "chunky" 
(bar1 = foo) if (!defined?(bar1) && foo) 
bar1 

이 경우 bar1은 nil로 끝납니다. 내가

foo = "chunky" 
if !defined?(bar2) && foo 
    bar2 = foo 
end 
bar2 

에 구조 조정을 경우 작동 - 바 2로 설정 한 경우에 "땅딸막 한"(나는 각각의 경우에 정의되지 않은 변수를 사용하고 있는지 확인하는 대신 두 번째 예에서 BAR1의 바 2를 사용했습니다).

인라인은 항상 bar1을 무언가로 설정하고 기본값을 nil로 설정합니까? 나는 if가 if falsy를 반환한다면, if가 if 부분보다 먼저 평가하지 않는다고 생각했다.

+0

관련 질문 (아마도 중복 - 말할 수 없다) : http://stackoverflow.com/questions/3775402/rubys-foo-true-if-defined-foo-wont-work -as-expected –

답변

7

과제의 왼쪽에 bareword가 표시되면 즉시 nil으로 초기화되므로 실패합니다. 따라서 (bar1 = foo) if (!defined?(bar1) && foo)을 수행 할 때 defined? 수표에 이 nil이됩니다. 여기에 간단한 예입니다 :

>> defined? foo 
=> nil 
>> foo = 1 if false 
=> nil 
>> foo 
=> nil 
>> defined? foo 
=> "local-variable" 
+1

This * "bareword가 할당의 왼쪽에 표시되면 실패합니다.이 값은 nil로 초기화됩니다."* 이전에 누락 된 Ruby 지식의 핵심 비트입니다. 감사! –

관련 문제