From: "knu (Akinori MUSHA)" Date: 2013-08-31T17:29:39+09:00 Subject: [ruby-dev:47678] [ruby-trunk - Feature #8838][Assigned] Enhancing Numeric#step Issue #8838 has been updated by knu (Akinori MUSHA). 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 ---------------------------------------- Feature #8838: Enhancing Numeric#step https://bugs.ruby-lang.org/issues/8838#change-41485 Author: knu (Akinori MUSHA) Status: Assigned Priority: Normal Assignee: knu (Akinori MUSHA) Category: core Target version: current: 2.1.0 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で入れてしまいませんか というのが今回の提案です。 -- http://bugs.ruby-lang.org/