2011-05-08 4 views
2

self.class.instance_variable_set("@var", ...)을 클래스 메서드 내부에서 호출하면 변수가 실제로 저장되는 위치는 어디입니까? 수업 자체에 있나요? 그 계급의 경우? 나는 다음 중 하나에 그것을 찾을 수 없습니다 : 나는 심지어 (class << self; self; end) 트릭을 사용하여 시도하지만루비 메타 프로그래밍 질문

e = Example.new 
e.instance_variables 
e.class.class_variables 

난 아무것도 (http://ruby-metaprogramming.rubylearning.com/html/seeingMetaclassesClearly.html를) 찾을 수 없습니다. 여기

(나는 필요에 따라 작동) 코드 조각 그러나 나는 그것이 작동하는 이유 :

module HandyModule 
    def self.included(base) 
    base.extend ClassMethods 
    end 
    module ClassMethods 
    def use_template(template_name) 
     self.class.instance_variable_set("@_template", template_name) 
    end 
    def build(attributes = {}) 
     template_name = self.class.instance_variable_get("@_template") 
     # do stuff with the template 
    end 
    end 
end 

class Example 
    include HandyModule 
    use_template :contact_form 
end 

은 본질적으로 나는이 편리한 모듈을 포함 할 수 있습니다 모르겠어요 후 나는 클래스가 메서드를 use_template이라고 부르며 내 빌드 방법에서 사용할 템플릿을 지정할 수 있습니다.

+0

클래스가 객체라는 사실을 잊지 마십시오. 그것들은'Class' 클래스를 가진 객체 일뿐입니다. –

답변

3

use_template을 클래스 정의 내에 호출하면 self은 클래스 Example입니다. self.class으로 전화 할 경우 Example.class 또는 Class입니다. 인스턴스 변수를 클래스의 클래스로 정의합니다.

class Class 
    p @_template 
end 
# prints :contact_form 

당신은 아마 self 대신 self.class의를 사용해야합니다.

+0

훌륭해. 지금 당장 말이야. 나는 단지 기억해야한다, 그것은 모두 '자기'의 맥락에 관한 것이다. – Dave