私はモジュールを含むRubyクラスを持っています。私はクラスを含むOpenStructのように動作します。私はOpenStructから明示的に継承せずにこれをどのように達成するのですか? OpenStruct
ので、代わりにOpenStructのように振る舞うようにRubyクラスを拡張できますか?
class Book < OpenStruct
include MyModule
end
私はモジュールを含むRubyクラスを持っています。私はクラスを含むOpenStructのように動作します。私はOpenStructから明示的に継承せずにこれをどのように達成するのですか? OpenStruct
ので、代わりにOpenStructのように振る舞うようにRubyクラスを拡張できますか?
class Book < OpenStruct
include MyModule
end
あなたのクラスが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.
これを行うと、標準ライブラリからデリゲートクラスを見ることができます。http://www.ruby-doc.org/stdlib-1.9.3/libdoc /delegate/rdoc/index.html –
の
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自体に依存したい強い理由はありますか?
あなたは何とかOpenStructクラスを使用するか、自分でこの機能を実装したいですか? – Flexoid
私はOpenStructを使いたい – Sathish