2013-01-18 3 views
1

Ruby에 REPL과 같은 것을 쓰고 있으며 실행시에 vars를 정의해야합니다. eval을 사용해야한다는 것을 알았지 만 irb 세션에서 발췌하여 테스트 해 보았습니다. 1.9.3에서 (즉, 1.8에서 일 것이다)Ruby 1.9.3 eval로 var 정의하기

> eval 'a = 3' 
=> 3 
> a 
=> NameError: undefined local variable or method `a' for main:Object 

그들은 1.9에서 변경 : 1.9 이후 변경 같은

> eval 'a = 3' 
=> 3 
> eval 'a' 
=> 3 

그래서 보인다. eval (또는 비슷한 것)을 사용하여 1.9.3에서 vars를 어떻게 정의 할 수 있습니까?

답변

3

IRB is lying to you. 이 스크립트 A와 :

eval 'a = 3' 
puts a 

은 1.8.7와 나를 위해 1.9.3에서 같은 방법으로 실패합니다.

불행하게도 동등한은 1.8에서 작업을 수행하지만
eval 'a = 3' 
eval 'puts a' 

여전히 스크립트로 1.9에서 작동하지 않습니다, 당신에 의해 그 대답에 모두 언급했다.

그러나 이것은 모두 나를 위해 작동 : 같은 binding이 변수 할당이 모두 같은 맥락에서 일을 의미합니다 사용

b = binding 
b.eval 'a = 3' 
b.eval 'puts a' 

. 컴파일 타임에 현지인이 묶여 있기 때문에 외부에서 읽을 수는 없지만 REPL을 작성하는 경우 "컴파일 타임"은 "다른 라인을 얻고 평가하면"괜찮습니다 .

+0

사실이 아니라면 컨텍스트 외부에서 변수를 읽을 수 없습니다. 다음은 작동 할 것입니다. a = b.eval ('a') –

+0

@KennethBaltrinic 저는 이것을 "외부에서 읽기"라고 부르지 않을 것입니다. 당신은 단지 당신을 위해 그것을 읽을 수있는 문맥을 요구하고 있습니다 :) – Eevee

관련 문제