假设我有一个自定义类,我应该覆盖什么才能获得类似数组的行为?我认为提供each
方法是不够的,因为这不会让我访问[]
方法?
我应该继承Array类吗?我应该在那里覆盖什么?
答案 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
通过使用委托,您只提供您想要的方法,而不是默认提供所有方法。