[#30408] Ruby 1.8.6 preview2 has been released — "Akinori MUSHA" <knu@...>

 Ruby 1.8.6 preview2 をリリースしました。

20 messages 2007/02/24
[#30414] fail to autoload at $SAFE==4 (Re: Ruby 1.8.6 preview2 has been released) — Hidetoshi NAGAI <nagai@...> 2007/02/25

永井@知能.九工大です.

[#30418] Re: fail to autoload at $SAFE==4 (Re: Ruby 1.8.6 preview2 has been released) — Nobuyoshi Nakada <nobu@...> 2007/02/25

なかだです。

[ruby-dev:30446] Re: Arrayのメソッド増強について

From: Tadashi Saito <shiba@...2.accsnet.ne.jp>
Date: 2007-02-27 18:56:25 UTC
List: ruby-dev #30446
こんばんは、斎藤と申します。

On Mon, 26 Feb 2007 15:17:46 +0900
Minero Aoki <aamine@loveruby.net> 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);
     }


--
斎藤ただし

In This Thread