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

Sat*_*ish 7 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
Run Code Online (Sandbox Code Playgroud)

代替

class Book < OpenStruct
  include MyModule
end
Run Code Online (Sandbox Code Playgroud)

ste*_*lag 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.
Run Code Online (Sandbox Code Playgroud)

  • 如果您这样做,您可能希望查看标准库中的委托类,而不是自己滚动:http://www.ruby-doc.org/stdlib-1.9.3/libdoc/delegate/rdoc/index。 html (3认同)