从不同来源提取数据的自定义数组类型对象

时间:2013-07-13 16:07:19

标签: ruby

我想设计一个行为类似数组的类,但也允许我将一组数据与另一组数据分开,以便某些操作仅对来自另一组的数据起作用。有什么好办法呢?

我的设计是将初始数据集存储在一个数组中,并且添加到此对象的任何新元素将在另一个数组中单独跟踪(称为“额外”数据)。

添加和删除此类对象中的项目仅对新元素进行操作,而对初始元素和新元素的组合将执行任何类型的搜索操作。

此对象中的元素索引是两个数组串联中的元素索引,因此如果初始数据中有3个元素,而额外数组中有4个元素,则额外数组中的第一个元素将返回index为3,而初始数组的第一个元素将返回索引0。

为了便于说明,这是它在代码中的外观

class MyClass

  def initialize(base_data)
    @base_elements = base_data # this is an array
    @extra_elements = []       # this stores the "new" data
  end

  def add(elem)
    @extra_elements << elem
  end

  def delete(elem)
    @extra_elements << elem
  end

  def all_elements
    @base_elements.concat(@extra_elements)
  end

  def find(elem)
    all_elements.find( ... )
  end

  def index (elem)
    all_elements.index( ... )
  end
end

理想情况下,这应该支持Enumerator中定义的所有方法,例如eachinject等。

1 个答案:

答案 0 :(得分:0)

根据你要求的几个修改,你几乎就在那里:

class MyClass
  include Enumerable

  def initialize(base_data)
    @base_elements = base_data # this is an array
    @extra_elements = []       # this stores the "new" data
  end

  def add(elem)
    @extra_elements << elem
  end

  def delete(elem)
    @extra_elements.delete(elem)
  end

  def all_elements
    @base_elements.concat(@extra_elements)
  end

  def index (elem)
    all_elements.index( ... )
  end

  def each(&block)
    all_elements.each(&block)
  end
end