我想创建 Range 的一个子类,以便指定一个不是 1 的步长,这样我就可以执行以下操作:
>> a = RangeWithStepSize.new(-1, 2, 0.5).each {|x| puts(x)}
-1.0
-0.5
0.0
0.5
1.0
1.5
2.0
=> -1..2
我的第一次实施尝试不起作用:
class RangeWithStepSize < Range
attr_reader :step_size
def initialize(start_v, end_v, step_size, exclusive = false)
super(start_v, end_v, exclusive)
@step_size = step_size
end
def each
self.step(step_size).each
end
end
>> a = RangeWithStepSize.new(-1, 2, 0.5).each {|x| puts(x)}
=> #<Enumerator: [-1.0, -0.5, 0.0, 0.5, 1.0, 1.5, 2.0]:each>
看来 RangeWithStepSize#each 正在返回一个有效的枚举器,但它没有枚举。知道为什么吗?
<aside>
这可能是相关的,但我注意到没有块的 Range#step 不会返回文档中指定的枚举器;它返回一个数组:
>> Range.new(-1, 2).step(0.5).class
=> Array
数组是可枚举的,但它不是枚举器。这是文档错误吗?</aside>
澄清
我想制作一个封装步长的 Range 版本,所以我可以这样做:
a = RangeWithStepSize(-1, 2, 0.5)
b = RangeWithStepSize(-1, 2, 0.25)
...因此枚举 a 会产生 0.5 的步长,而 b 会产生 0.25。