8

モジュールを含むRubyクラスがあります。インクルードクラスをOpenStructのように動作させたい。OpenStructから明示的に継承せずにこれを実現するにはどうすればよいですか?

class Book
  include MyModule
end

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

それ以外の

class Book < OpenStruct
  include MyModule
end
4

2 に答える 2

9

クラスが処理しないすべてのメソッドを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.
于 2012-05-25T21:04:06.587 に答える
1

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

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

于 2012-05-25T19:50:49.697 に答える