From: Yukihiro Matsumoto Date: 2010-09-09T09:59:45+09:00 Subject: [ruby-dev:42204] Re: Enhancing Numeric#step まつもと ゆきひろです In message "Re: [ruby-dev:42200] Re: Enhancing Numeric#step" on Thu, 9 Sep 2010 00:09:52 +0900, "Akinori MUSHA" writes: |> |なおかつ増分のみの指定もできるように疑似キーワード引数を導入して |> |みました。 |> | |> |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: にしたので、従来のように順序で意味を |> |表すより読みやすいと思います。いかがでしょうか。 |> |> キーワード引数を付けるなら、stepよりはtoの方が向いているケー |> スもありそうな気がします。結局stepという名前を受け入れられる |> かどうかがポイントですね。 | | 「stepよりはtoの方が向いているケースもありそう」の意味が取れ |ませんでした。逆かな?(でも 1.step(step: 2) は重言すぎる…) たとえば 1.0.step(by: 0.1, to: 2.0).to_a # [1.0, 1.1, ..., 2.0] (余談:誤差に注意) は 1.0.to(2.0, by: 0.1).to_a の方がより読みやすい記法のような気がした、という意味でした。 | 上限を指定しなかったらずっと繰り返すのは自然だと思いますし、 |日頃から 1.step(10, 2) という表現を読みづらく感じていたので、 |今回の提案に至りました。 一晩考えて、stepメソッドへの拡張そのものには賛成しようと思い ました。ただ、今後キーワード引数を取るメソッドが増加すること が容易に想像できますので、C APIでもキーワード引数に対応した いと思います。 たとえば、 rb_scan_args(argc, argv, "02:", &limit, &step, &kw); でキーワード辞書を取れたり、 rb_scan_keywords(kw, "by", &step, "to", &limit, NULL); で、キーワード辞書を分解したりするようなAPIはどうだろうかと 考えています。 このようなAPIをベースにstep拡張を取り込みたいのですが、どの ような手順で行いましょうか。私がまずC APIを作って、武者さん がそれに対応したstepパッチをコミットするとかですかね。 # いつ私の時間がとれるかが課題だけど。 まつもと ゆきひろ /:|)