2010-07-02 2 views
3

class_eval을 사용하여 Ruby 변수 범위에 대한 모범 사례에 대한 질문이 있습니다.class_eval에 대한 클래스 수준 변수의 대안은 무엇입니까?

블록에서 class_eval 블록의 첫 번째 변수와 두 번째 변수는 정의되지 않습니다.

def parent_method(opts={}) 
@@first = opts[:percent] 
@@second = (10 * @@first).to_i 

SecondClass.class_eval do 
    def second_method; return {:a => @@first, :b => @@second}; end; 
end 
end 
  1. 무엇이다 : 나는 일이를 얻기 위해 찾은 유일한 방법은 제 1 및 제 2 클래스 레벨의 변수를 확인하는 것입니다 때문에

    def parent_method(opts={}) 
    first = opts[:percent] 
    second = (10 * first).to_i 
    
    SecondClass.class_eval do 
        def second_method; return {:a => first, :b => second}; end; 
    end 
    end 
    

    이, 범위 지정 문제가 될 것으로 보인다 이 시나리오의 가장 좋은 방법은 무엇입니까? 전역 변수가이 시나리오에서 좋지 않은 선택이라는 것을 알았지 만, 결과적으로 클래스 수준의 변수가 비슷하게 싫증 나게되는 넓은 범위 때문에?

  2. 변수 범위를 다루는 것 외에도 class_eval에서 이러한 변수의 액세스 가능성을 해결할 수있는 다른 방법이 있습니까?

답변

5

class_eval 때문에 문제가 발생하지 않았지만 def 때문에 발생했습니다. 그런 식으로 메서드를 정의하면 새로운 범위가 도입됩니다. 문제를 해결하는 가장 좋은 방법은 다음과 같습니다.

def parent_method(opts={}) 
    first = opts[:percent] 
    second = (10 * first).to_i 

    SecondClass.class_eval do 
     define_method(:second_method) { return {:a => first, :b => second} } 
    end  
end 
+0

감사합니다 -이 작품! – shedd

관련 문제