2011-02-09 11 views
2

のインスタンスメソッドに含めるには、ザ・そのメソッドの内部以来dosn't仕事をInitShared含まルビー:使用モジュールクラス

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 

以下のコードを見てください。

ファイルをチェックしてからモジュールを組み込み、そのモジュールの変数にアクセスします。

+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 

:includeはプライベートクラスメソッドなので、インスタンスレベルメソッドで呼び出すことはできません。別の解決策だけ特定のインスタンスのためにそのモジュールを含める場合、あなたがして行を置き換えることができます。この行を含める:

# 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

の代わりに、あなたも

を使用することができますSamnangの

singleton_class.send(:include, InitShared) 

を使用して

extend InitShared 

これは同じですが、バージョンに依存しません。モジュールには、オブジェクト自身のシングルトンクラスのみが含まれます。

関連する問題