Ruby 我应该实现什么才能使自定义类完全像数组一样工作?

Ruby 我应该实现什么才能使自定义类完全像数组一样工作?,ruby,arrays,Ruby,Arrays,假设我有一个自定义类,我应该重写什么以获得类似数组的行为?我认为为每个方法提供一个是不够的,因为这不能让我访问[]方法 我应该继承数组类吗?我应该在其中覆盖什么?对于类似可枚举的行为(听起来像是您想要的),您应该包含可枚举的,以获得可枚举的模块功能,这意味着您需要为每个模块提供一个方法。这将为您提供许多所需的相关方法() 如果您只需要类似于[]的功能,只需以下方法即可: def [] key # return value for key here. end def []= key, val

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


我应该继承数组类吗?我应该在其中覆盖什么?

对于类似可枚举的行为(听起来像是您想要的),您应该
包含可枚举的
,以获得
可枚举的
模块功能,这意味着您需要为每个
模块提供一个方法。这将为您提供许多所需的相关方法()

如果您只需要类似于
[]
的功能,只需以下方法即可:

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

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

从数组继承非常有意义。您可以扩展阵列行为,而不必担心与该阵列类型的其他用户的交互,而且您甚至不需要做一些琐碎的工作来混合使用Enumerable


如果您需要钩子,您可能需要钩子,您可以调用
super()
转发当前消息。

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

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

通过使用委托,您只提供您知道需要的方法,而不是默认情况下提供所有方法。

数组提供了
[]
方法和可枚举功能。那么,也许我应该考虑同时添加<代码>每个< /代码>和这2个访问器方法?如果你是这样的,那么提供<代码>每个,<代码> []/COD>,<代码> []/<代码>和<代码>包括可枚举的< /代码>。这个方法与子类数组有什么好处吗?这取决于它。你能说“是一个数组吗?”如果是的话,把它作为数组的一个子类,因为你需要所有的功能。如果你能说的只是“在某些方面像一个数组,因为它支持
[]
”,那么就支持
[]
,不要子类化。祝贺你想用正确的方法来做它。太多的人首先想到猴子补丁阵列来添加他们的自定义功能。