2011-02-09 5 views
2

루비 : 클래스의 인스턴스 메소드에 모듈 포함 사용

아래 코드를 살펴보십시오.
initshared.rb 
module InitShared 
    def init_shared 
    @shared_obj = "foobar" 
    end 
end 

myclass.rb

class MyClass 
    def initialize() 
    end 
    def init 
    file_name = Dir.pwd+"/initshared.rb" 
    if File.file?(file_name) 
     require file_name 
     include InitShared 
     if self.respond_to?'init_shared' 
     init_shared 
     puts @shared_obj 
     end 
    end 
    end 
end 

포함 InitShared는 메소드 내부에서 작동하지 않습니다.

파일을 확인한 다음 모듈을 포함하고 해당 모듈의 변수에 액세스하려고합니다.

+1

비어있는'initialize' 메소드는 필요 없습니다. –

답변

0
module InitShared 
    def init_shared 
    @shared_obj = "foobar" 
    end 
end 

class MyClass 
    def init 
    if true 
     self.class.send(:include, InitShared) 

     if self.respond_to?'init_shared' 
     init_shared 
     puts @shared_obj 
     end 
    end 
    end 
end 

MyClass.new.init 

: 포함은 개인 클래스 메서드이므로 인스턴스 수준 메서드에서 호출 할 수 없습니다. 이 라인과 같습니다 : 당신은 당신이이 라인을 대체 할 수있는 특정 예를 들어 해당 모듈 포함 할 경우 또 다른 해결책은

# Ruby 1.9.2 
self.singleton_class.send(:include, InitShared) 

# Ruby 1.8.x 
singleton_class = class << self; self; end 
singleton_class.send(:include, InitShared) 
9

대신 사용하여 삼영의는

singleton_class.send(:include, InitShared) 

당신은 또한 사용할 수 있습니다

extend InitShared 

동일하지만 버전 독립적입니다. 모듈은 객체 자체의 싱글 톤 클래스에만 포함됩니다.

관련 문제