ruby - 为类添加可枚举功能和更多功能

时间:2015-01-02 14:01:57

标签: ruby enumerable

我想把所有这些红宝石款待都提供给我的班级(处理基础数据结构)。 include Enumarable只完成部分工作。 什么是最好的方式?

class A
    def initialize
        @data = 10.times.map { |e| e }
    end

    include Enumerable
    def each(&block)
        @data.each(&block)
    end
end

#works great
A.new.each {}
A.new.select {|e| e > 3}
A.new.reject {|e| e > 3}
A.new.partition {|e| e > 3}
A.new.count

# those will fail
A.new.size
A.new.length
A.new.select! {|e| e > 3}

2 个答案:

答案 0 :(得分:3)

sizelength以及所有改变集合的方法,如select!,都不属于Enumerable

如果你想要它们,你必须自己实现它们。

答案 1 :(得分:1)

您提供的示例与Array没有什么不同,因此您可以按照以下方式实现

class A < Array; end

a = A.new(10.times.map { |e| e })

#works great
a.new.each {}
a.new.select {|e| e > 3}
a.new.reject {|e| e > 3}
a.new.partition {|e| e > 3}
a.new.count
a.new.size
a.new.length
a.new.select! {|e| e > 3}

现在当然没有实际目的,因为它只是一个Array,所以根据你希望这个类做什么 else ,你可以添加它作为额外的功能。

例如

class A < Array
  def contains_the_answer_of_all_things?
    include? 42
  end
end

这样

a = A.new(10.times.map { |e| e })
a.contains_the_answer_of_all_things?
#=> false

b = A.new(100.times.map {|e| e })
b.contains_the_answer_of_all_things?
#=> true