2011-08-12 3 views
2

thisthis을 비롯한 몇 가지 내용을 읽었지만 아래의 예는 그들이 말하는 내용과 다릅니다. 실제로 한 사람이 토론에서 비슷한 예를 들지만 무시됩니다.이 한 줄의 조건부에서 다르게 대우가 처리되는 이유는 무엇입니까?

그래서, (조건에 할당에 대한 경고를 무시) IRB에서 실행 :

(puts x) if (x = 0) # NameError: undefined local variable or method `x'... 
x     # => 0 
(puts x) if (x = 0) # "0", => nil 

하지만 두 번째 시간 오류가 없습니다.

"파서가 실제로 무엇을하고 있는지 이해하면이 최적화가 모두 명확 해집니다"라는 의미 에서조차 의미가 있습니까? 왜냐하면 나에게는 꽤 바람직하지 않은 것처럼 보입니다.

는 오류를 발생시키지 않습니다

if newvar=0 
    puts newvar 
end 

에 (오른쪽?) 위의 조건이 동일해야, 명확해야합니다.


업데이트 :이 질문 이후로이 주제에 대해 더 많은 게시물이 있습니다. 예 :
http://seejohncode.com/2012/07/31/ruby-gotcha-single-line-conditionals/.

답변

1

해야한다고 생각,이 Rubinius에서 잘 작동합니다

Welcome to IRB. You are using rubinius 1.2.4dev (1.8.7 7ae451a1 yyyy-mm-dd JI) 
>> (puts x) if (x = 0) #=> nil 
0 

가 나는 MRI에 이상한 구문 분석 버그 말을하는 경향이 있어요.

+0

그는 범위 규칙이 변경된 Ruby 1.9를 사용하고 있다고 생각합니다. – Serabe

+0

이것은 흥미 롭습니다. 나는 실제로 1.8.7, 1.9.2 및 jruby를 시도했다. rvm은 루비니 우스를 설치하기 위해 영원히 투옥하고 있었기 때문에 나는 그것을 시험해보기 전에 게시했습니다. – ohspite

0

저는이 점에서 x에 0을 할당한다고 생각합니다.

(puts x) if (x = 0) 

내가 그것을 이상하게

(puts x) if (x == 0) 
+0

맞습니다. 저는 의도적으로 0에 x를 할당하고 있습니다. 하지만 그 부분은'if' 이전에 실행되어야하므로 오류가 처음 발생하지 않아야합니다. – ohspite

0

먼저 조건부 절에서 x=0을 확인하십시오. puts x 그래서 그것을 볼 수 없습니다를 들어, x는 아직 선언되지 않은 사용자의 경우

if x = 0 
    puts x 
end 

: 두 번째

, puts x if x = 0은 동등하지 않다.

1

이 경우의 차이점은 변수를 구문 분석 할 때 변수가 존재하는지 여부입니다. 의 경우 :

if x=0 
    puts x 
end 

변수 x는 x를 사용하는 줄을 구문 분석하기 전에 정의됩니다.

즉, 오류 메시지는 런타임 오류가 아닌 구문 분석 시간 오류입니다.

관련 문제