2011-09-03 3 views
1

껍질 같은 앱에서 코드를 평가하고 싶습니다. 버튼을 누르면 코드가 평가되고 결과가 사용자에게 표시됩니다. 코드를 다시 평가하면 이전 평가에서 정의 된 모든 것이 더 이상 존재하지 않도록하고 싶습니다. 예를 들어,이 # 1 평가 상상 :JRuby에서 매번 새로운 컨텍스트에서 코드를 평가할 수 있습니까?

puts "Hello world" 
user_variable1 = 10 
$USER_VARIABLE2 = 20 

내가 그것에 대한 평가 # 2를 원 user_variable1$USER_VARIABLE2의 값이없는 존재. 이것이 내가 각 실행마다 어떤 종류의 컨텍스트를 사용하려고 생각하는 이유입니다. 그러나, 나는 어디에서 더 많은 정보를 찾을 지 모른다.

답변

3

명령을 실행하는 방법을 사용하여 다른 프로세스에서 다른 스크립트 (또는 동일한 스크립트)를 실행할 수도 있습니다.

system('myscript.rb') 

또는

`myscript.rb` 

이 어떤 변수가 해제되어 있는지 확인합니다 비슷해하지만, 환경 변수는 물론 동일합니다. 하지만 루비 1.9부터 재설정 할 수 있습니다. 그래서 같이 :

eval.rb :

당신이 eval() 기능에 가까운 무언가를 원하는 경우에

system('myscript.rb', :unsetenv_others => true) 

, 당신은 evalExt 기능을 바로 첫 번째 매개 변수를 평가하는 것이다 eval.rb을 만든 다음 정의 할 수 있습니다 데프 evalExt (스크립트) 시스템 ("eval.rb \"# {스크립트} \ "", : unsetenv_others이 => TRUE),536

eval(ARGV[0]) 

그리고 다른 스크립트 끝 JRuby를 경우

evalExt('puts "test"') 
evalExt('puts "test1"') 

Wikipedia에 설명 된대로 JRuby를에서 자바 코드를 호출 한 후 ScriptEngineManager를 사용하여, 쉽게 다른 루비 엔진을 호출 할 수 있어야한다 :

require 'java' 

mgr = ScriptEngineManager.new(); 
rbEngine = mgr.getEngineByExtension("rb"); 

def evalExt(script) 
    rbEngine.eval(script); 
end 

을 어쩌면 당신에게 스크립트 컨텍스트 또는 바인딩 (see this article)을 재설정해야합니다.

모두가 말했듯이, 가장 쉬운 해결책은 전역 변수가 설정되지 않았는지 확인하는 것입니다. 그런 다음 별도의 컨텍스트를 사용할 필요가 없습니다.

+0

자고있는 JRuby jar에서 이것을 실행하면 어떻게 될까요? 나는 루비를 길로 가지지 않을 것이고, 또 다른 JRuby를 호출하는 것은 너무 느릴 것이다. – Geo

+0

고마워요! 그것은 아름답게 작동합니다! – Geo

관련 문제