Ruby 4.0 リファレンスマニュアル

instance method Numeric#step

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

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

Complex では未定義化されています。

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

1.1.step(1.5, 0.1) { |n| p n }
# => 1.1
#    1.2000000000000002
#    1.3
#    1.4000000000000001
#    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.2000000000000002
#    1.3000000000000003
#    1.4000000000000004
# 1.5 が表示されない

[SEE_ALSO] Integer#downto