From: TOYOFUKU Chikanobu Date: 2008-03-25T15:21:18+09:00 Subject: [ruby-dev:34123] Re: Array#take,take_while,drop,drop_whlie 豊福です。 In message "Re: [ruby-dev:34067] Array#take,take_while,drop,drop_whlie" on Sun, 16 Mar 2008 14:53:41 +0900, "Yusuke ENDOH" 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 `
' $ 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 `
' $ 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 は(配列の許す限り)動いて欲しい ですね。 --- 豊福