关于Ruby范围?

17

像这样

range = (0..10)

如何获得这样的数字:

0 5 10 

每次加上五,但不能超过十

如果范围是 (0..20) ,那么我应该得到这个结果:

0 5 10 15 20
3个回答

28
尝试使用 .step() 以给定的步长进行遍历。
(0..20).step(5) do |n|
    print n,' '
end

提供给定列表中第n个元素的JavaScript函数

0 5 10 15 20

正如dominikh所提到的,你可以在末尾添加.to_a来获取一个可存储的数字列表形式:(0..20).step(5).to_a


3
如果你想存储这些数字,可以使用 (0..10).step(5).to_a -- 不过这需要 Ruby >= 1.8.7。另一种方法是使用 0.step(10, 5).to_a,也需要 Ruby >= 1.8.7。 - Dominik Honnef

4

像Dav所说的那样,但要添加to_a:

(0..20).step(5).to_a # [0, 5, 10, 15, 20]

通常情况下,您不需要添加 to_a,除非您确实需要一个数组。 - Konrad Rudolph

2
http://ruby-doc.org/core/classes/Range.html中描述的step方法应该可以完成任务,但是可能会影响可读性。
只需考虑:
(0..20).step(5){|n| print ' first ', n }.each{|n| print ' second ',n }

你可能认为步骤(5)会产生一个新的范围,就像why_的问题最初想要的那样。但是each是在(0..20)上调用的,如果您想要“重用”0-5-10-15-20范围,则必须将其替换为另一个step(5)。
也许您可以使用类似于(0..3).map{|i| i*5}的东西?
但是,使用.to_a方法“持久化”step方法的结果也应该可以正常工作。

3
在这种情况下,我认为这个步骤比那种地图更易读。 - Amber
(0..20).step(5).each{...}.each{...}会按照你的意愿执行。 - Marc-André Lafortune
@efi:不会的,它会打印.....!!!!! 你真的试过吗?原因是step(5)(没有块)返回一个枚举器,将产生5次。这个枚举器被each两次返回。让你感到困惑的是,step(5){a block}返回原始的可枚举对象,所以进一步的each将操作整个范围。 - Marc-André Lafortune
@efi:我一定是在做白日梦。我非常惊讶。enumerator.each{}返回基本对象这一事实对我来说很不直观。它甚至没有在rubyspec中规定。我会检查一下是否只有我这样! - Marc-André Lafortune
@Marc-AndréLafortune 这段代码会按照你的预期执行:(0..20).step(5).map{print '.'}.each{print '!'} 返回 .....!!!!! => [nil, nil, nil, nil, nil].each 会对 .map 的返回值进行操作。 - Micka
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接