我应该如何实现自定义类的行为与数组完全相同?

时间:2011-06-04 22:54:50

标签: ruby arrays

假设我有一个自定义类,我应该覆盖什么才能获得类似数组的行为?我认为提供each方法是不够的,因为这不会让我访问[]方法?

我应该继承Array类吗?我应该在那里覆盖什么?

3 个答案:

答案 0 :(得分:7)

对于可枚举的行为(听起来像你想要的那样),你应该include Enumerable获得Enumerable模块功能,这意味着你需要提供一个方法each。这将为您提供许多您想要的相关方法(Enumerable details)。

如果您只想要[]类功能,则只需要以下方法,仅此而已:

def [] key
  # return value for key here.
end

def []= key, value
  # store value under key here.
end

答案 1 :(得分:2)

从Array继承非常有意义。您可以扩展Array行为而不必担心与Array类型的其他用户的交互,甚至不需要在Enumerable中进行简单的工作。

如果您需要挂钩,您可以拨打super()转发当前消息。

答案 2 :(得分:1)

如果您有一个存储数据的实际数组,则可能需要

require "forwardable"

class CustomArray
  extend Forwardable # For def_delegators
  include Enumerable # Optional

  def_delegators :@actual_array, :[], :[]=, :each

  def initialize(actual_array)
    @actual_array = actual_array
  end
end

通过使用委托,您只提供您想要的方法,而不是默认提供所有方法。