作为数组和哈希的对象

时间:2015-02-14 06:52:11

标签: ruby

我正在尝试编写一个充当数组的类(即继承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和每个哈希。

1 个答案:

答案 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会导致性能下降。

希望它有所帮助。