2012-05-05 2 views
0
BasicObject.class_eval do 
    def instance(ins) 
     eval "@#{ins}=#{ins}", binding 
    end 
end 

해당 코드가 맞습니까? 내가하고 싶은 일은 다음 코드에서 Foo 클래스 안에 새로운 인스턴스 변수 인 bar를 생성하는 것입니다. 이 코드를 실행 한 후 무엇을 얻을 :왜이 오류가 반환됩니까?

class Foo 
    bar = 3 
end 
Foo.instance(:bar) 

은 다음과 같습니다

NameError: undefined local variable or method `bar for Foo:Class 
     from /Users/Solomon/Desktop/Ruby/instance.rb:3:in `instance' 
     from /Users/Solomon/Desktop/Ruby/instance.rb:3:in `eval' 
     from /Users/Solomon/Desktop/Ruby/instance.rb:3:in `instance' 

왜이 일어나고있다.

+0

이전 질문에서와 같은 이유 - 클래스 선언이 처리되면 "bar"가 존재하지 않습니다. –

답변

0

여기 몇 가지 .... .... BasicObject에 대해 instance 인스턴스 메서드를 정의했습니다. 그런 다음 Foo 개체에서이 인스턴스 메서드를 호출합니다. Foo 객체는 클래스입니다. Foo 객체에 대한 인스턴스 변수를 설정하지 않았습니다. @ 부호로 인스턴스 변수를 설정합니다. instance 메서드는 인스턴스 변수 @ins를 자체로 설정합니다.

binding은 현재 변수 바인딩을 반환하는 메서드이기 때문에 여기에 , binding이 필요하지 않습니다. 저장된 "환경"을 전달해야하는 경우 binding 만 저장하면됩니다. , binding을 갖는 것은 아무런 상처를주지 않지만 불필요합니다.

BasicObject.class_eval do 
    def instance(ins) 
     eval "@#{ins}= @#{ins}", binding  # @ after the '=' 
    end 
end 



class Foo 
    @bar = 3  # @ here 
end 
Foo.instance(:bar) 
puts Foo.instance_variable_get("@bar") # Shows the instance variable @bar for Foo object 
관련 문제