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不是模块,并且您不能使模块从类继承,因此您需要编写自己的模块method_missing来实现 OpenStruct 功能。值得庆幸的是,这是很少的工作。整个 OpenStruct 类只有大约 80 行代码,其中大部分您甚至可能并不完全需要。

您是否有充分的理由想要依赖 OpenStruct 本身?

于 2012-05-25T19:50:49.697 回答