我可以扩展Ruby类以动态地表现得像OpenStruct吗?

时间:2012-05-25 19:25:51

标签: ruby module metaprogramming mixins openstruct

我有一个包含模块的Ruby类。我希望include类的行为类似于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

2 个答案:

答案 0 :(得分:8)

您可以将您的类无法处理的所有方法委托给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 :(得分:1)

由于OpenStruct不是模块,并且您不能使模块继承自类,因此您需要编写自己的模块,使用method_missing来实现OpenStruct功能。谢天谢地,这是一项很少的工作。整个OpenStruct类只有大约80行代码,而且大多数代码甚至可能都不需要。

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