我正在尝试编写一个充当数组的类(即继承Array
类中的方法)和作为哈希(即继承Hash
类中的方法),基于传递给它的对象。
class MyClass
end
class_a = MyClass[1,2,3,4,5,6,7,8,9,10] # => Acts like an Array
class_a[1] # => 2
class_h = MyClass[:a => 1, :b => 2] # => Acts like a Hash
class_h.key(1) #=> :a
我知道Ruby doe并不真正支持多重继承。我怎么能做到这一点?帮助赞赏。
修改
用例:
假设我有一个类在哈希上执行一些'特殊'函数(根据条件转换哈希,执行某种排序的哈希查找等)
我会写这样的课:
class MyClass < Hash
def some_function
code
end
end
and use it like so
hash = MyClass[:a => 1, :b => 2, :c => 3].some_function
但是当我做这样的事情时,会出现一个小问题
hash = MyClass[[
{:a => 1, :b => 2},
{:a => 2, :b => 3},
{:a => 3, :b => 3}
]].some_function
在上面的例子中,我需要迭代数组,并调用some_function
和每个哈希。
答案 0 :(得分:2)
您想要实施Proxy
pattern。最简单的实现,不关心细节,如下所示:
class MyClass
def initialize o
@o = o
end
def method_missing meth, *args, &cb
@o.respond_to?(meth) ? @o.send(meth, *args, &cb) : super
end
end
class_a = MyClass.new [1,2,3,4,5,6,7,8,9,10]
class_a.[] 1
#⇒ 2
class_h = MyClass.new({ :a => 1, :b => 2 })
class_h.key(1)
#⇒ :a
通常,这都是关于创建类的实例变量并将MyClass
的实例上调用的方法传递给它。
稍后您可能希望为变量类型添加显式检查,例如:
throw 'NOT AN ARRAY' unless Array === @o
请注意,与本机方法调用相比,调用method_missing
会导致性能下降。
希望它有所帮助。