我想把所有这些红宝石款待都提供给我的班级(处理基础数据结构)。 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}
答案 0 :(得分:3)
size
,length
以及所有改变集合的方法,如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