2013-03-20 2 views
0

Ruby에서 임의의 코드를 실행할 수있는 환경을 여러 개 갖고 싶습니다. 이 코드는 새 클래스를 정의 할 수 있습니다.이 클래스를 정의한 환경에서만이 새 클래스를 사용할 수 있습니다.Ruby에서 다른 범위에 숨겨진 클래스를 정의 할 수 있습니까?

예를 들어, 나는 이런 식으로 뭔가를 할 :

class Environment 
    def evaluate(&code) 
    # Evaluate the code in this environment. 
    end 
end 

e1 = Environment.new 
e2 = Environment.new 

e1.evaluate do 
    class InnerClass 
    # ... 
    end 

    puts InnerClass.nil? # false 
end 

e2.evaluate do 
    puts InnerClass.nil? # true 
end 

내가 instance_eval를 사용하고 Binding 내부 평가를 시도했다, 그러나이 중 어느 것도 다른 환경에서 클래스를 숨 깁니다. 이것을 할 수있는 좋은 방법이 있습니까?

답변

0

을 그것이 나오는 것에 따라, instance_eval 작동합니다. 그러나 인스턴스 내에서 클래스를 래핑하려면 블록 대신 문자열을 제공해야합니다. 확인 해봐.

e1.instance_eval <<EOF 
    class InnerClass 
    end 
    puts InnerClass.nil? # false 
EOF 

e2.instance_eval <<EOF 
    InnerClass.nil? # NameError 
EOF 

문자열을 사용하는 구현은 익명 클래스의 모든 것을 래핑하지만 블록을 사용하는 구현은 그렇지 않습니다.

1

당신은 그런 instance_eval 및 동적 클래스 정의를 사용할 수 있습니다

e1.instance_eval do 
    innerClass = Class.new do 
    # ... 
    end 
    puts innerClass.nil? # false 
end 

e2.instance_eval do 
    innerClass.nil? # NameError, innerClass not defined 
end 
+0

매우 좋습니다. 네가 할 수 있다는 것을 나는 몰랐다. 그러나 아직 완벽하지는 않습니다. 새 클래스를 대문자 이름 (예 : "InnerClass")에 할당하려고하면 전역 상수가됩니다. –

+0

예, 클래스를 상수에 할당하면이를 상수에 할당합니다. 클래스를 상수에 할당하지 않으려면이를 상수에 할당하지 마십시오. –

+0

@ JörgWMittag 하하 그렇습니다. 나는 이것을 이해합니다. 문제는 전역 상수가 아닌 로컬 상수가되도록하려는 것입니다. 그것은 Ruby에는 존재하지 않는 것 같습니다. –

관련 문제