豊福です。

In message "Re: [ruby-dev:34067] Array#take,take_while,drop,drop_whlie"
    on Sun, 16 Mar 2008 14:53:41 +0900, "Yusuke ENDOH" <mame / tsg.ne.jp> writes:
> +rb_ary_take(VALUE obj, VALUE n)
> +{
> +    return rb_ary_subseq(obj, 0, FIX2LONG(n));

  take の引数が負のときと大きな整数のときに enum と array で
動きが異なっています。

負のとき
$ ruby -e 'p (1..2).take(-1)'
-e:1:in `take': negative array size (or size too big) (ArgumentError)
        from -e:1:in `<main>'
$ ruby -e 'p [1,2].take(-1)'
nil

大きい整数のとき
$ ruby -e 'p (1..2).take(10000000000)'
-e:1:in `take': bignum too big to convert into `long' (RangeError)
        from -e:1:in `<main>'
$ ruby -e 'p [1,2].take(10000000000)'
nil

やや大きい整数のとき
$ ruby -e 'p (1..2).take(1000000000)'
$ ruby -e 'p [1,2].take(1000000000)'
[1, 2]

  ここで enum で何も表示されないのは ary_new の中の
    RARRAY(ary)->ptr = ALLOC_N(VALUE, len);
のところでどうかなっているようです。

  大きな整数のときにも take は(配列の許す限り)動いて欲しい
ですね。
---
                        豊福