instance method Numeric#step

step(limit, step = 1) {|n| ... } -> self[permalink][rdoc]
step(limit, step = 1) -> Enumerator
step(by: 1, to: Float::INFINITY) {|n| ... } -> self
step(by: 1, to: Float::INFINITY) -> Enumerator
step(by:, to: -Float::INFINITY) {|n| ... } -> self
step(by:, to: -Float::INFINITY) -> Enumerator

self からはじめ step を足しながら limit を越える前までブロックを繰り返します。step は負の数も指定できます。また、limit や step には Float なども指定できます。

[PARAM] limit:
ループの上限あるいは下限を数値で指定します。step に負の数が指定された場合は、下限として解釈されます。
[PARAM] step:
各ステップの大きさを数値で指定します。負の数を指定することもできます。
[PARAM] to:
引数limitと同じですが、省略した場合はキーワード引数byが正の数であれば Float::INFINITY、負の数であれば -Float::INFINITYを指定したとみなされます。
[PARAM] by:
引数 step と同じです。
[RETURN]
ブロックが指定された時は self を返します。
[RETURN]
ブロックが指定されなかった時は Enumerator を返します。
[EXCEPTION] ArgumentError:
step に 0 を指定した場合に発生します。
2.step(5){|n| p n}
2
3
4
5

1.1.step(1.5, 0.1) {|n| p n}
1.1
1.2
1.3
1.4
1.5

10.step(6, -1){|n| p n}
10
9
8
7
6

3.step(by:2, to:10){|n| p n}
3
5
7
9

注:浮動小数点数の 0.1 は 2進数では正確な表現ができない(2進数で 0.1は 0.00011001100....となる)ので、以下のようなループでは誤差が生じて意図した回数ループしないことがある。step はこの誤差を考慮して実装されている。

i = 1.1
while i <= 1.5
  p i
  i += 0.1
end
=> 1.1
   1.2
   1.3
   1.4   <- 1.5 が表示されない

[SEE_ALSO] Integer#downto