From: Tadashi Saito Date: 2007-02-28T03:56:25+09:00 Subject: [ruby-dev:30446] Re: Arrayのメソッド増強について こんばんは、斎藤と申します。 On Mon, 26 Feb 2007 15:17:46 +0900 Minero Aoki wrote: > >> |--- Array#take {|item| .... } 別名案:take_while, slice{} (snip) > では、take_while (で、ブロック付きのみ) ならどうです > か? その後、自分より各言語に詳しくHaskellも知っている友人と議論したのです が、自分も"take"に賛成票を投じようと思います。「簡単なものは簡単に」と いう事で。 take(n)も、まつもとさんがコミットなさったようにEnumerableのメソッドで あれば、あるべきだと思います。 > いえ、それは違います。Array#drop は順番を保ったまま配列を > 処理するために使うメソッドです。例えばメールの文字列を > 行単位の文字列配列で持っているとき、 > > body = lines.drop {|line| not line.strip.empty? } > > と書くとメール本体 (の最初にセパレータの空行が付いたも > の) が > 得られるわけです。 卜部さんにもご指摘いただきましたが、理解しました。「最初から順番に見てい る」だけですね。ありがとうございます。 ということで早速、Enumerable#takeのドキュメントへのパッチです。 加えて、take_i()/drop_i() の変数 n は不要だと思います。 Index: enum.c =================================================================== --- enum.c (revision 11926) +++ enum.c (working copy) @@ -1224,8 +1224,6 @@ static VALUE take_i(VALUE i, VALUE *arg) { - long n = arg[1]; - if (arg[1]-- == 0) rb_iter_break(); rb_ary_push(arg[0], i); return Qnil; @@ -1250,8 +1248,8 @@ * * a = [1, 2, 3, 4, 5] * - * a.take(3) # => [4, 5] - * a.take {|i| i < 3 } # => [3, 4, 5] + * a.take(3) # => [1, 2, 3] + * a.take {|i| i < 3 } # => [1, 2] * */ @@ -1278,8 +1276,6 @@ static VALUE drop_i(VALUE i, VALUE *arg) { - long n = arg[1]; - if (arg[1] == 0) { rb_ary_push(arg[0], i); } -- 斎藤ただし