gpt4 book ai didi

ruby - 如何为范围创建自定义迭代器

转载 作者:太空宇宙 更新时间:2023-11-03 16:09:04 24 4
gpt4 key购买 nike

我想创建 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>这可能是相关的,但我注意到没有 block 的 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。

最佳答案

你知道你可以做到这一点,对吗?此处不需要继承。

(-1..2).step(0.5) do |x|
puts x
end

您的代码将通过一些小的调整工作:

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 (&block)
self.step(step_size).each(&block)
end

end

关于ruby - 如何为范围创建自定义迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7587355/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com