我有一个包含模块的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
答案 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本身?