2012-05-25 13 views
7

私はモジュールを含むRubyクラスを持っています。私はクラスを含むOpenStructのように動作します。私はOpenStructから明示的に継承せずにこれをどのように達成するのですか? OpenStructので、代わりにOpenStructのように振る舞うようにRubyクラスを拡張できますか?

class Book < OpenStruct 
    include MyModule 
end 
+0

あなたは何とかOpenStructクラスを使用するか、自分でこの機能を実装したいですか? – Flexoid

+0

私はOpenStructを使いたい – Sathish

答えて

7

あなたのクラスがOpenStructに対応していないすべてのメソッドを委任することができます:

require 'ostruct' 

class Test_OS 

    def initialize 
    @source = OpenStruct.new 
    end 

    def method_missing(method, *args, &block) 
    @source.send(method, *args, &block) 
    end 

    def own_method 
    puts "Hi." 
    end 

end 

t = Test_OS.new 
t.foo = 1 
p t.foo #=> 1 
t.own_method #=> Hi. 
+1

これを行うと、標準ライブラリからデリゲートクラスを見ることができます。http://www.ruby-doc.org/stdlib-1.9.3/libdoc /delegate/rdoc/index.html –

1

class Book 
    include MyModule 
end 

module MyModule 
    def self.included(klass) 
    # Make including class behave like OpenStruct 
    end 
end 

はモジュールではなく、あなたはモジュールはクラスから継承されることはありませでき、あなたはOpenStruct機能を実装するためにmethod_missingを使用して独自のモジュールを作成する必要があります。ありがたいことに、これはほとんど仕事ではありません。 OpenStructクラス全体は約80行のコードしかなく、そのほとんどはおそらく完全には必要ではありません。

OpenStruct自体に依存したい強い理由はありますか?

関連する問題