Project

General

Profile

Actions

Feature #8838

closed

Enhancing Numeric#step

Added by knu (Akinori MUSHA) over 10 years ago. Updated over 10 years ago.

Status:
Closed
Target version:
[ruby-dev:47662]

Description

DevelopersMeeting20130831Japan用に起票します。

ちょうど3年ほど前、 [ruby-dev:42194] で私が提案したのが以下の内容です。

 Numeric#step の仕様の拡張を提案します。

 現在、 Numeric#step は limit を必須引数としているため、手軽に
無限数列を生成することができません。Float::INFINITY ないし 1/0.0
のような値を渡せば可能ではありますが、「1から上限なしでカウント
アップする」のようなよくある要件を満たす方法としては冗長です。

 そこで、上限(下限)なしでループするように limit も省略可能とし、
なおかつ増分のみの指定もできるように疑似キーワード引数を導入して
みました。

1.step {|i| ... } # i = 1, 2, 3, ...
-1.step(by:-1) {|i| ... } # i = -1, -2, -3, ...
1.0.step(by: 0.1, to: 2.0).to_a # [1.0, 1.1, ..., 2.0] (余談:誤差に注意)
2.step(by:2).take(100) # [2, 4, 6, ..., 200]

 キーワードを by: と to: にしたので、従来のように順序で意味を
表すより読みやすいと思います。いかがでしょうか。

これについては、[ruby-dev:42204]にて「一晩考えた」まつもとさんにOKをい
ただきました。ただ、ここからC APIを設けようという方向に話が進みました。

一晩考えて、stepメソッドへの拡張そのものには賛成しようと思い
ました。ただ、今後キーワード引数を取るメソッドが増加すること
が容易に想像できますので、C APIでもキーワード引数に対応した
いと思います。

それを私の方でうまくまとめきれず、尻切れとんぼになってしまいました。

それから3年経ち、Ruby 2.0では「本物の」キーワード引数文法が導入されまし
たが、Cレベルでキーワード引数をdestructureするようなAPIはまだありません。

Enumeratorの進化(Enumerator::Lazyの導入等)で無限数列を手軽に生成した
いシーンは増えていると思いますが、 Enumerator#with_index(n=0) が使える
ケースを除けば、上記提案にもある通り、 1.upto(Float::INFINITY) などと書
くしかなく、スマートとは言いがたい現状です。

そこで、APIは別途議論するとして、機能としては2.1で入れてしまいませんか
というのが今回の提案です。

Updated by knu (Akinori MUSHA) over 10 years ago

  • Category changed from misc to core
  • Status changed from Open to Assigned
  • Assignee changed from matz (Yukihiro Matsumoto) to knu (Akinori MUSHA)

=begin
[[DevelopersMeeting20130831Japan]]にてまつもとさんにOKをいただきましたので、近いうちに入れます。
=end

Actions #2

Updated by knu (Akinori MUSHA) over 10 years ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r42781.
Akinori, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


Enhance Numeric#step.

  • numeric.c (num_step): Default the limit argument to infinity and
    allow it to be omitted. Keyword arguments (by: and to:) are
    introduced for ease of use. [Feature #8838] [ruby-dev:47662]
    [ruby-dev:42194]

  • numeric.c (num_step): Optimize for infinite loop.

Actions

Also available in: Atom PDF

Like0
Like0Like0