[$BDs0F(B] Array#tail

e$B1sF#$H?=$7$^$9!#e(B

e$B@hF,$NMWAG0J30$NG[Ns$rJV$9e(B Array#tail
e$B$H$$$&%a%=%C%I$rDs0F$7$^$9!#e(B

[1, 2, 3, 4].tail #=> [2, 3, 4]

e$B8=>u$G$Oe(B ary[1…-1] e$B$,%$%G%#%*%`$K$J$C$F$$$k$H;W$$$^$9$,!"e(B

  • e$B%$%s%G%C%/%9$KIi$NCM$r;H$C$F$$$F$d$d%H%j%C%-!<e(B
  • (e$B;d$N<g4Q$G$Oe(B) e$B8+1I$($b$"$^$jNI$/$J$$e(B
  • e$B$=$N$o$j$K$+$J$jIQ=Pe(B

e$B$J$N$G!"@lMQ$N%a%=%C%I$Ge(B ary.tail e$B$H=q$1$k$H$$$$$H;W$$$^$9!#e(B

e$B!Ve(BHaskell e$BG>$K$d$5$7$$!W$H$$$&8z2L$b$"$j$^$9e(B (?)

String#[] e$B$J$I$b4^$`$N$G@53N$JCM$G$O$J$$$G$9$,!“e(Bruby
e$B$N%3!<%ICf$@$1$G$be(B
193 e$B2U=j$[$I$”$j$^$9!#e(B

$ find . -name *.rb | xargs grep “[1..-1]” | wc -l
193

e$B$H$j$"$($:<BAu$7$F$_$^$7$?!#e(B
e$B$D$$$G$Ke(B Array#head e$B$re(B first e$B$Ne(B alias
e$B$K$7$F$$$^$9!#e(B

e$B$h$m$7$/$48!F$2<$5$$!#e(B

Index: array.c

— array.c (revision 13858)
+++ array.c (working copy)
@@ -785,6 +785,8 @@

  • call-seq:
  • array.first     ->   obj or nil
    
  • array.first(n)  ->   an_array
    
    • array.head      ->   obj or nil
      
    • array.head(n)   ->   an_array
      
    • Returns the first element, or the first +n+ elements, of the array.
    • If the array is empty, the first form returns nil, and
      the
      @@ -832,6 +834,48 @@
      }
      }

+/* call-seq:

    • array.tail    -> obj or nil
      
    • array.tail(n) -> sub_array
      
    • Returns the array without the first element, or the first +n+
      elements,
    • of self. If the array is empty, the first form returns
    • nil, and the second form returns an empty array.
    • Equivalent to:
    • def tail(n = 1)
      
    •   raise ArgumentError, "negative array size" if n < 0
      
    •   self[n..-1] || (n == 1 ? nil : [])
      
    • end
      
    • a = [ "q", "r", "s", "t" ]
      
    • a.tail     #=> ["r", "s", "t"]
      
    • a.tail(2)  #=> ["s", "t"]
      
    • a.tail(5)  #=> []
      
    • [].tail    #=> nil
      
    • [].tail(2) #=> []
      
  • */
    +static VALUE
    +rb_ary_tail(int argc, VALUE *argv, VALUE ary)
    +{
  • VALUE len;
  • if (argc == 0) {
  • if (RARRAY_LEN(ary) == 0) return Qnil;
  • len = LONG2NUM(RARRAY_LEN(ary) - 1);
  • return ary_shared_first(1, &len, ary, Qtrue);
  • }
  • else if (NUM2LONG(argv[0]) < 0) {
  • rb_raise(rb_eArgError, “negative array size”);
  • }
  • else if (RARRAY_LEN(ary) < NUM2LONG(argv[0])) {
  • return rb_ary_new3(0);
  • }
  • else {
  • argv[0] = LONG2NUM(RARRAY_LEN(ary) - NUM2LONG(argv[0]));
  • return ary_shared_first(argc, argv, ary, Qtrue);
  • }
    +}

/*

  • call-seq:
  • array.fetch(index)                    -> obj
    

@@ -3247,7 +3291,9 @@
rb_define_method(rb_cArray, “at”, rb_ary_at, 1);
rb_define_method(rb_cArray, “fetch”, rb_ary_fetch, -1);
rb_define_method(rb_cArray, “first”, rb_ary_first, -1);

  • rb_define_alias(rb_cArray, “head”, “first”);
    rb_define_method(rb_cArray, “last”, rb_ary_last, -1);

  • rb_define_method(rb_cArray, “tail”, rb_ary_tail, -1);
    rb_define_method(rb_cArray, “concat”, rb_ary_concat, 1);
    rb_define_method(rb_cArray, “<<”, rb_ary_push, 1);
    rb_define_method(rb_cArray, “push”, rb_ary_push_m, -1);
    Index: test/ruby/test_array.rb
    ===================================================================
    — test/ruby/test_array.rb (revision 13858)
    +++ test/ruby/test_array.rb (working copy)
    @@ -720,6 +720,18 @@
    assert(a1.hash != a3.hash)
    end

  • def test_head

  • assert_equal(3, @cls[3, 4, 5].head)

  • assert_equal([], @cls[3, 4, 5].head(0))

  • assert_equal([3], @cls[3, 4, 5].head(1))

  • assert_equal([3, 4], @cls[3, 4, 5].head(2))

  • assert_equal([3, 4, 5], @cls[3, 4, 5].head(3))

  • assert_equal([3, 4, 5], @cls[3, 4, 5].head(4))

  • assert_raise(ArgumentError) { @cls[3, 4, 5].head(-1) }

  • assert_equal(nil, @cls[].head)

  • assert_equal([], @cls[].head(1))

  • end

  • def test_include?
    a = @cls[ ‘cat’, 99, /a/, @cls[ 1, 2, 3] ]
    assert(a.include?(‘cat’))
    @@ -1103,6 +1115,18 @@
    assert_equal(@cls[], @cls[].sort!)
    end

  • def test_tail

  • assert_equal([4, 5], @cls[3, 4, 5].tail)

  • assert_equal([3, 4, 5], @cls[3, 4, 5].tail(0))

  • assert_equal([4, 5], @cls[3, 4, 5].tail(1))

  • assert_equal([5], @cls[3, 4, 5].tail(2))

  • assert_equal([], @cls[3, 4, 5].tail(3))

  • assert_equal([], @cls[3, 4, 5].tail(4))

  • assert_raise(ArgumentError) { @cls[3, 4, 5].tail(-1) }

  • assert_equal(nil, @cls[].tail)

  • assert_equal([], @cls[].tail(1))

  • end

  • def test_to_a
    a = @cls[ 1, 2, 3 ]
    a_id = a.id

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:32198] [e$BDs0Fe(B] Array#tail”
on Sat, 10 Nov 2007 01:43:04 +0900, “Yusuke ENDOH” [email protected]
writes:

|e$B@hF,$NMWAG0J30$NG[Ns$rJV$9e(B Array#tail e$B$H$$$&%a%=%C%I$rDs0F$7$^$9!#e(B
|
| [1, 2, 3, 4].tail #=> [2, 3, 4]

e$B$J$s$+F,e(B(head)e$B0J30$OA4It?,Hxe(B(tail)e$B$C$F$N$O!"L>A0$,!#e(BHaskelle$B$Ge(B
e$B$O$=$&$J$s$G$9$+!#e(B

e$B@hF|!“e(Bfirste$B$KBP1~$9$ke(Bbutfirste$B$rF3F~$7$?$i$”$^$j$KITI>$G<h$je(B
e$B$d$a$^$7$?!#e(Blogoe$B$G$NAH$_9g$o$;$J$s$@$1$I$J!#e(B

e$B1sF#$G$9!#e(B

07/11/10 e$B$Ke(B Yukihiro M.[email protected]
e$B$5$s$O=q$-$^$7$?e(B:

|e$B@hF,$NMWAG0J30$NG[Ns$rJV$9e(B Array#tail e$B$H$$$&%a%=%C%I$rDs0F$7$^$9!#e(B
|
| [1, 2, 3, 4].tail #=> [2, 3, 4]

e$B$J$s$+F,e(B(head)e$B0J30$OA4It?,Hxe(B(tail)e$B$C$F$N$O!"L>A0$,!#e(BHaskelle$B$Ge(B
e$B$O$=$&$J$s$G$9$+!#e(B

Haskell e$B!"e(BConcurrent Clean e$B!“e(BOCaml e$B!“e(BSML
e$B$J$I!”$$$o$f$k7?IU$-$N4X?t7?8@8le(B
e$B$?$A$Oe(B (e$B;d$NCN$C$F$k8B$je(B) e$B$_$s$Je(B head/tail
e$B!”$^$?$O>JN,7A$Ne(B hd/tl e$B$G$9!#e(B

e$B@hF|!“e(Bfirste$B$KBP1~$9$ke(Bbutfirste$B$rF3F~$7$?$i$”$^$j$KITI>$G<h$je(B
e$B$d$a$^$7$?!#e(Blogoe$B$G$NAH$_9g$o$;$J$s$@$1$I$J!#e(B

e$B$*$C$H!“e(Bruby-core:13069
e$B$”$?$j$G$bF1$8$h$&$JOC$,$“$C$?$N$G$9$M!#e(B
butfirst e$B$O<*47$l$J$$L>A0$G$O$”$j$^$9$,!“$9$G$Ke(B first
e$B$,$”$k$3$H$rB:=E$9$ke(B
e$B0UL#$G$"$j$@$H;W$$$^$9!#e(B
ruby-core e$B$NOC$r$A$c$s$HDI$C$F$^$;$s$,!“e(BEnumerable
e$B$N%a%=%C%I$@$C$?$+$ie(B
e$BITI>$@$C$?$N$G$O$J$$$+!”$H$$$&5$$,$J$s$H$J$/$7$^$9e(B (each_but_first
e$B$NJ}$,e(B
e$B$$$$$H$+8@$o$l$F$$$k$h$&$G$9$7e(B) e$B!#e(B

e$B!!$5$5$@$G$9!%e(B

Yusuke ENDOH wrote:

|e$B@hF,$NMWAG0J30$NG[Ns$rJV$9e(B Array#tail e$B$H$$$&%a%=%C%I$rDs0F$7$^$9!#e(B
|
| [1, 2, 3, 4].tail #=> [2, 3, 4]

e$B$J$s$+F,e(B(head)e$B0J30$OA4It?,Hxe(B(tail)e$B$C$F$N$O!"L>A0$,!#e(BHaskelle$B$Ge(B
e$B$O$=$&$J$s$G$9$+!#e(B

Haskell e$B!"e(BConcurrent Clean e$B!“e(BOCaml e$B!“e(BSML e$B$J$I!”$$$o$f$k7?IU$-$N4X?t7?8@8le(B
e$B$?$A$Oe(B (e$B;d$NCN$C$F$k8B$je(B) e$B$_$s$Je(B head/tail e$B!”$^$?$O>JN,7A$Ne(B hd/tl e$B$G$9!#e(B

e$B!!;d$O!$e(BArray#tail e$B$Oe(B Array#last
e$B$HF1$80UL#$KFI$a$F$7$^$C$?$s$G$9e(B
e$B$,!$$=$&$G$b$J$$$G$7$g$&$+!%e(B

e$B@>;3$H?=$7$^$9e(B

e$B$J$s$+F,e(B(head)e$B0J30$OA4It?,Hxe(B(tail)e$B$C$F$N$O!"L>A0e(B
e$B$,!#e(BHaskelle$B$Ge(B
e$B$O$=$&$J$s$G$9$+!#e(B

tail e$B$H$$$&e(Bmethode$B$,$"$C$?$i!“e(Bunix commande$B$Ne(B
taile$B$N$h$&$Ke(B
ne$BHVL\0J9_$rJV$7$?$j!”:G8e$Ne(Bne$B8D$NMWAG$NG[Ns$rJV$9G=NO$r4|BTe(B
e$B$7$=$&$K;W$$$^$9!#e(B

e$B$J$N$G!"Ii?t$re(BArgument errore$B$K$7$J$$$G!"8e$m$+$ie(Bne$B8De(B
e$B$NMWAG$rJV$7$?$[$&$,$$$$$H;W$$$^$9!#e(B
e$B$9$k$H!"0z?t$Ne(Bsemanticse$B$b9g$C$F;H$$$d$9$/$J$k$H;W$$$^$9!#e(B

defaulte$B$r2?$K$9$k$+$H$$$&;~$Ke(B-10e$B$8$c$J$/$Fe(B+1e$B$K$7$h$&e(B
e$B$H$$$&$3$H$G$7$g$&$,!"e(B
e$B$5$9$,$K%W%m%0%i%`=q$/;~$K:G8e$Ne(B10e$BMWAG$r$H$$$&$3$H$O>/$J$$e(B
e$B$G$7$g$&$+$ie(B:)
+1e$B$H$$$&$N$O0-$/$J$$$H;W$$$^$9!#e(B

e$B0lJ}$Ge(B

e$B$H$j$"$($:<BAu$7$F$_$^$7$?!#e(B
e$B$D$$$G$Ke(B Array#head e$B$re(B first e$B$Ne(B alias e$B$K$7$Fe(B
e$B$$$^$9!#e(B

heade$B$He(Bfirste$B$O0c$&0UL#$N$[$&$,$$$$$s$8$c$J$$$G$7$g$&$+!)e(B

first, laste$B$OG[Ns$NMWAG$N0l$D$rJV$9e(Bmethode$B$JJ70O5$$,$"$j$^e(B
e$B$9$,!“e(B
head, taile$B$OJV$9MWAG$,0l$D$G$bG[Ns$N$^$^$J$[$&$,<+A3$J5$$,$7$^$9e(B
e$B$N$Ge(B
e$B0z?t$N>JN,$5$l$?e(Bheade$B$Oe(Bfirst(1)e$B$G$”$k$Y$-$8$c$J$$$+$He(B
e$B46$8$^$9!#e(B

e$B1sF#$G$9!#e(B

07/11/11 e$B$Ke(B SASADA Koichi[email protected] e$B$5$s$O=q$-$^$7$?e(B:

e$B!!;d$O!$e(BArray#tail e$B$Oe(B Array#last e$B$HF1$80UL#$KFI$a$F$7$^$C$?$s$G$9e(B
e$B$,!$$=$&$G$b$J$$$G$7$g$&$+!%e(B

tail e$B$O@hF,0J30$NMWAG$?$A$G$9!#e(Blast e$B$O:G8e$NMWAG$G$9!#e(B

[1, 2, 3, 4].tail #=> [2, 3, 4]
[1, 2, 3, 4].last #=> 4

e$B!!$5$5$@$G$9!%e(B

Yusuke ENDOH wrote:

e$B!!;d$O!$e(BArray#tail e$B$Oe(B Array#last e$B$HF1$80UL#$KFI$a$F$7$^$C$?$s$G$9e(B
e$B$,!$$=$&$G$b$J$$$G$7$g$&$+!%e(B

tail e$B$O@hF,0J30$NMWAG$?$A$G$9!#e(Blast e$B$O:G8e$NMWAG$G$9!#e(B

[1, 2, 3, 4].tail #=> [2, 3, 4]
[1, 2, 3, 4].last #=> 4

e$B!!$"$!!$$9$_$^$;$s!%e(B

e$B!!Ds0F$5$l$F$$$k0UL#$O$o$+$C$F$$$k$s$G$9$,!$;d$K$O%a%=%C%IL>$r8+$?$He(B
e$B$-!$N><T$N0c$$$,$o$+$i$J$$$J$!!$$H!%$D$^$j!$$Q$C$H8+$Fe(B

[1, 2, 3, 4].tail #=> 4

e$B$HA[A|$9$k$H$$$&0UL#$G$9!%>/?tGI$J$N$+$J$!!%e(B

In article
[email protected],
“Yusuke ENDOH” [email protected] writes:

e$B$7$+$7e(B Haskell e$B$?$A$+$i$NO"A[$@$He(B head e$B$O@hF,$NMWAG!"e(Btail e$B$O@hF,0J30$Ne(B
e$BMWAG$?$A$J$s$G$9$h$M!#e(B

e$B$=$l$C$F%j%9%H$NOC$J$s$8$c$J$$$G$7$g$&$+!#G[Ns$G$b$=$&$J$s$G$9$+e(B?

e$B1sF#$G$9!#e(B

07/11/11 e$B$Ke(B Tanaka A.[email protected] e$B$5$s$O=q$-$^$7$?e(B:

e$B$7$+$7e(B Haskell e$B$?$A$+$i$NO"A[$@$He(B head e$B$O@hF,$NMWAG!"e(Btail e$B$O@hF,0J30$Ne(B
e$BMWAG$?$A$J$s$G$9$h$M!#e(B

e$B$=$l$C$F%j%9%H$NOC$J$s$8$c$J$$$G$7$g$&$+!#G[Ns$G$b$=$&$J$s$G$9$+e(B?

e$B$b$A$m$s%j%9%H$G$NOC$G$9$,!“e(BRuby e$B$NG[Ns$OBg%/%i%9<g5A$J$N$Ge(B
e$BO"A[$NHOaF$G$O$J$$$G$7$g$&$+!#e(B
e$B5$$K$J$k$J$i%^%K%e%”%k$K7W;;NL$r=q$$$F$*$1$P$$$$$H;W$$$^$9!#e(B

e$B5U$Ke(B Haskell e$B$de(B OCaml e$B$N%j%9%H$K$Oe(B n

e$BHVL$NMWAG$r$H$k4X?t$,$"$j$^$9!#e(B

e$B$H$O$$$(!“e(Bhead/tail e$B$H$$$&L>A0$K$3$@$o$k$D$b$j$O$”$j$^$;$s!#e(B
ary.head e$B$,e(B ary.first(1)
e$B$HF1CM$K$J$k$N$O$A$g$C$HDq93$"$j$^$9$1$I!#e(B

e$BA0ED$G$9!#e(B

On 11/11/07 12:35, SASADA Koichi wrote:

e$B!!Ds0F$5$l$F$$$k0UL#$O$o$+$C$F$$$k$s$G$9$,!$;d$K$O%a%=%C%IL>$r8+$?$He(B
e$B$-!$N><T$N0c$$$,$o$+$i$J$$$J$!!$$H!%$D$^$j!$$Q$C$H8+$Fe(B

[1, 2, 3, 4].tail #=> 4

e$B$HA[A|$9$k$H$$$&0UL#$G$9!%>/?tGI$J$N$+$J$!!%e(B

e$B;d$bF10U8+$G$9$,!"BP0F$H$7$F$Oe(Breste$B$/$i$$$7$+;W$$$D$-$^$;$s$G$7$?!#e(B

e$B$b$A$m$se(BLispe$B$Ne(Bfirst/reste$B$+$i!#e(B

e$B1sF#$G$9!#e(B

07/11/10 e$B$Ke(B Tomoaki NISHIYAMA[email protected]
e$B$5$s$O=q$-$^$7$?e(B:

e$B$J$N$G!"Ii?t$re(BArgument errore$B$K$7$J$$$G!"8e$m$+$ie(Bne$B8De(B
e$B$NMWAG$rJV$7$?$[$&$,$$$$$H;W$$$^$9!#e(B
e$B$9$k$H!"0z?t$Ne(Bsemanticse$B$b9g$C$F;H$$$d$9$/$J$k$H;W$$$^$9!#e(B

e$B$3$l$OJXMx$+$bCN$l$^$;$s$M!#e(B
e$B:#$N<BAu$Oe(B first
e$B$N0z?t$N%;%^%s%F%#%/%9$K9g$o$;$k$3$H$@$19M$($F$^$7$?!#e(B

first, laste$B$OG[Ns$NMWAG$N0l$D$rJV$9e(Bmethode$B$JJ70O5$$,$"$j$^e(B
e$B$9$,!“e(B
head, taile$B$OJV$9MWAG$,0l$D$G$bG[Ns$N$^$^$J$[$&$,<+A3$J5$$,$7$^$9e(B
e$B$N$Ge(B
e$B0z?t$N>JN,$5$l$?e(Bheade$B$Oe(Bfirst(1)e$B$G$”$k$Y$-$8$c$J$$$+$He(B
e$B46$8$^$9!#e(B

unix command
e$B$O40A4$KA[Dj30$@$C$?$s$G$9$,!"3N$+$K$=$l$i$+$i$NO"A[$@$He(B
e$B$=$N5sF0$r4|BT$9$k$+$bCN$l$^$;$s$M!#e(B
e$B$7$+$7e(B Haskell e$B$?$A$+$i$NO"A[$@$He(B head
e$B$O@hF,$NMWAG!"e(Btail e$B$O@hF,0J30$Ne(B
e$BMWAG$?$A$J$s$G$9$h$M!#e(B

e$B?M$K$h$C$F4|BT$9$k5sF0$,0[$J$k$N$O!"$d$C$Q$jL>A0$,%@%a$J$s$G$7$g$&$+!#e(B
e$B8D?ME*$K$Oe(B tail
e$B$,C;$/$F9%$-$J$s$G$9$,!“B>$KNI$$L>A0$O$”$k$G$7$g$&$+!#e(B

  • subseq
  • subsequence
  • follower
  • but_first
  • from_second
  • second_or_later (e$BD9e(B)
  • continuation (e$B7ye(B)
  • cdr (e$B7ye(B)

e$B$J$+$@$G$9!#e(B

At Mon, 12 Nov 2007 14:45:56 +0900,
M.Suzuki wrote in [ruby-dev:32224]:

e$B;d$O!“e(Bheade$B$r@Z$j=P$7$?$i!”;D$j$Oe(Bbodye$B$+$J$H!#e(B
e$B$G!":G8e$NMWAG$,e(Btaile$B$H!#e(B

e$B%.%m%A%sJ}<0!)e(B

headlesse$B$G$O!#e(B

e$B1sF#$G$9!#e(B

e$BDs0F<+BN$X$NH?BP$O:#$N$H$3$m$J$$$h$&$G$9$,!"$^$D$b$H$5$s$N5v$;$ke(B
e$BL>A0$O$^$@$J$$$G$7$g$&$+!#=P$F$-$?L>A0$rD9$5=g$KJB$Y$^$9!#e(B

  • cdr (e$B7ye(B)
  • rest
  • body
  • tail
  • subseq
  • headless
  • follower
  • but_first
  • subsequence
  • from_second
  • continuation (e$B7ye(B)
  • second_or_later (e$BD9e(B)

e$B8D?ME*$K$Oe(B rest e$B$,$$$$$N$G$O$J$$$+$H;W$C$F$$$^$9!#e(B
e$BC;$$$7$o$+$j$d$9$$$7!“e(BLisp e$B$H$$$&$9$P$i$7$$8"0Re(B (?)
e$B$b$”$k$h$&$G$9$7!#e(B

e$B$3$s$K$A$O!#e(BM.Suzukie$B$G$9!#e(B

  • cdr (e$B7ye(B)
    e$B;d$O!“e(Bheade$B$r@Z$j=P$7$?$i!”;D$j$Oe(Bbodye$B$+$J$H!#e(B
    e$B$G!":G8e$NMWAG$,e(Btaile$B$H!#e(B

e$B%.%m%A%sJ}<0!)e(B

---- M.Suzuki ----

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:32238] Re: [e$BDs0Fe(B] Array#tail”
on Mon, 12 Nov 2007 22:37:14 +0900, “Yusuke ENDOH” [email protected]
writes:

|e$BDs0F<+BN$X$NH?BP$O:#$N$H$3$m$J$$$h$&$G$9$,!"$^$D$b$H$5$s$N5v$;$ke(B
|e$BL>A0$O$^$@$J$$$G$7$g$&$+!#=P$F$-$?L>A0$rD9$5=g$KJB$Y$^$9!#e(B

e$BDs0F$K$OH?BP$G$O$J$$$N$G$9$,!“L>A0$K$O$”$s$^$j5$$KF~$C$?$N$,e(B
e$B$J$$$s$G$9!"$^$@!#e(B

| - cdr (e$B7ye(B)
| - rest
| - body
| - tail
| - subseq
| - headless
| - follower
| - but_first
| - subsequence
| - from_second
| - continuation (e$B7ye(B)
| - second_or_later (e$BD9e(B)
|
|e$B8D?ME*$K$Oe(B rest e$B$,$$$$$N$G$O$J$$$+$H;W$C$F$$$^$9!#e(B
|e$BC;$$$7$o$+$j$d$9$$$7!“e(BLisp e$B$H$$$&$9$P$i$7$$8"0Re(B (?) e$B$b$”$k$h$&$G$9$7!#e(B

e$B8D?ME*$K$Oe(Bbutfirste$B$,9%$$G$9$,e(B(e$B$"$!!"2{$+$7$Ne(BLOGO)e$B!"0lHL<u$1e(B
e$B$O$7$J$$$
$?$$$G$9$M!#$,!“CG$8$Fe(Bbut_firste$B$G$O$J$$$H$3$m$,%^e(B
e$B%K%”%C%/!#e(B

reste$B$H$$$&$N$O5$;}$A$O$o$+$k$N$G$9$,!“e(Breste$B$O!VM>$j!”;D$j!W$Ge(B
e$B$9$+$i!“$J$K$+$,$”$C$F$Ne(Breste$B$@$H;W$&$N$G$9!#$3$N>l9g$O$?$V$se(B
firste$B$KBP$9$ke(Breste$B$J$N$G$7$g$&$,!“L>A0$NCf$K$=$l$,L@<($5$l$J$$e(B
e$B$N$O$”$s$^$jNI$/$J$$$J$“$H;W$C$?$j$7$F!#e(BLispe$B$K$”$k$N$O$o$+$ke(B
e$B$N$G$9$,!“L>A0$,NI$/$J$$$;$$$+$”$^$j;H$o$l$F$J$$$_$?$$$G$9$7e(B
(e$B:rF|$^$GK:$l$F$^$7$?$h!";d$be(B)e$B!#e(B

e$B$H$3$m$G!“L>A0$,7h$^$C$F$3$N%a%=%C%I$r<BAu$7$?>l9g!”$3$N%a%=%Ce(B
e$B%I$O%*%W%7%g%J%k$J0z?t$r<u$1IU$1$k$s$G$9$+$Me(B(firste$B$H$NN`?d$Je(B
e$B$i<u$1IU$1$=$&e(B)e$B!#$=$N>l9g$O!"$=$N0z?t$N0UL#$O$I$&$J$k$s$G$9$+e(B
e$B$M$'!#e(B

                            e$B$^$D$b$He(B e$B$f$-$R$me(B /:|)

e$B1sF#$G$9!#e(B

07/11/12 e$B$Ke(B Yukihiro M.[email protected]
e$B$5$s$O=q$-$^$7$?e(B:

reste$B$H$$$&$N$O5$;}$A$O$o$+$k$N$G$9$,!“e(Breste$B$O!VM>$j!”;D$j!W$Ge(B
e$B$9$+$i!“$J$K$+$,$”$C$F$Ne(Breste$B$@$H;W$&$N$G$9!#$3$N>l9g$O$?$V$se(B
firste$B$KBP$9$ke(Breste$B$J$N$G$7$g$&$,!“L>A0$NCf$K$=$l$,L@<($5$l$J$$e(B
e$B$N$O$”$s$^$jNI$/$J$$$J$"$H;W$C$?$j$7$F!#e(B

e$B$h$/$o$+$j$^$9!#e(B

e$B$H$3$m$G!“L>A0$,7h$^$C$F$3$N%a%=%C%I$r<BAu$7$?>l9g!”$3$N%a%=%Ce(B
e$B%I$O%*%W%7%g%J%k$J0z?t$r<u$1IU$1$k$s$G$9$+$Me(B(firste$B$H$NN`?d$Je(B
e$B$i<u$1IU$1$=$&e(B)e$B!#$=$N>l9g$O!"$=$N0z?t$N0UL#$O$I$&$J$k$s$G$9$+e(B
e$B$M$'!#e(B

e$B0z?t$N0UL#$be(B first e$B$+$iN`?d$9$l$P!"e(B

ary.first(n) #=> e$B@hF,e(B n e$B8D$NMWAG$?$A$+$i$J$kG[Nse(B
ary.rest(n) #=> e$B@hF,e(B n e$B8D0J30$NMWAG$?$A$+$i$J$kG[Nse(B

ex) [1,2,3,4].rest(2) #=> [3, 4]

e$B$H$J$k$H;W$$$^$7$?!#:G=i$N%Q%C%A$Ne(B tail
e$B$b$=$N$h$&$K<BAu$7$F$^$9!#e(B

At Sat, 10 Nov 2007 01:43:04 +0900,
Yusuke ENDOH wrote:

  • (私の主観では) è¦‹æ „ãˆã‚‚ã‚ã¾ã‚Šè‰¯ããªã„
  • ãã®ã‚ã‚Šã«ã‹ãªã‚Šé »å‡º

ary.drop(1) はどうでしょうか。

なので、専用のメソッドで ary.tail と書けるといいと思います。

 drop は Enumerable のメソッドですが、性能や効率に難があるという
ことでしたら、 Array でオーバーライドしてもいいと思います。


/
/__ __ Akinori.org / MUSHA.org
/ ) ) ) ) / FreeBSD.org / Ruby-lang.org
Akinori MUSHA aka / (_ / ( (__( @ iDaemons.org / and.or.jp

“Different eyes see different things,
Different hearts beat on different strings –
But there are times for you and me when all such things agree”

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:32255] Re: [e$BDs0Fe(B] Array#tail”
on Tue, 13 Nov 2007 12:34:06 +0900, “Yusuke ENDOH” [email protected]
writes:

|e$B$*A{$,$;$7$?$D$$$G$K!"e(Btake e$B$He(B drop e$B$N%G%U%)%k%H$re(B 1 e$B$K$9$k%Q%C%Ae(B
|(+ e$B%F%9%He(B) e$B$r=q$$$F$_$^$7$?!#$I$&$G$7$g$&$+!#e(B

take_whilee$B$He(Bdrop_whilee$B$rJ,N%$7$?$N$G==J,$K$“$j$($kOC$G$O$”$ke(B
e$B$N$G$9$,!"<B:]$N$H$3$mL50z?t$Ne(Btakee$B$,@hF,$NMWAG$rJV$9$H$+!"L5e(B
e$B0z?t$Ne(Bdrope$B$,@hF,$NMWAG$rMn$H$9$H$+$O<+L@$G$J$$5$$,$7$^$9$,!“e(B
e$B<u$1F~$l$i$l$k$b$N$G$7$g$&$+!#8D?ME*$K$O47$l$l$PJ,$+$k$h$&$Je(B
e$B5$$O$7$^$9$,!”%G%6%$%s$K$*$$$F!V47$l$l$P!W$H$$$&$N$O4m81$J0xe(B
e$B;R$@$C$?$j$7$^$9e(B(e$B$I$s$J$K0-$$%G%6%$%s$G$b47$l$l$P$J$s$H$+$Je(B
e$B$k$+$ie(B)e$B!#e(B

                            e$B$^$D$b$He(B e$B$f$-$R$me(B /:|)

e$B1sF#$G$9!#e(B

07/11/13 e$B$Ke(B Akinori MUSHA[email protected]
e$B$5$s$O=q$-$^$7$?e(B:

ary.drop(1) e$B$O$I$&$G$7$g$&$+!#e(B

e$B$“$”$“!”$9$C$+$jB8:_$rK:$l$F$^$7$?!#e(B
e$B$“$j$,$H$&$4$6$$$^$9!”$3$l$GBg>fIW$G$9!#e(B

e$B$*A{$,$;$7$?$D$$$G$K!"e(Btake e$B$He(B drop e$B$N%G%U%)%k%H$re(B 1
e$B$K$9$k%Q%C%Ae(B
(+ e$B%F%9%He(B) e$B$r=q$$$F$_$^$7$?!#$I$&$G$7$g$&$+!#e(B

Index: enum.c

— enum.c (revision 13902)
+++ enum.c (working copy)
@@ -1405,21 +1405,31 @@

/*

  • call-seq:
    • enum.take                  => array
      
    • enum.take(n)               => array
      
    • Returns first n elements from enum.
    • Returns first n elements from enum. If n is not specified,
    • returns an array containing only the first element.
    • a = [1, 2, 3, 4, 5, 0]
      
    • a.take                # => [1]
      
    • a.take(3)             # => [1, 2, 3]
      
    */

static VALUE
-enum_take(VALUE obj, VALUE n)
+enum_take(int argc, VALUE *argv, VALUE obj)
{
VALUE args[2];

  • VALUE n;
  • args[1] = NUM2LONG(n);
  • if (argc == 0) {
  • args[1] = 1;
  • }
  • else {
  • rb_scan_args(argc, argv, “01”, &n);
  • args[1] = NUM2LONG(n);
  • }
    args[0] = rb_ary_new2(args[1]);
    rb_block_call(obj, id_each, 0, 0, take_i, (VALUE)args);
    return args[0];
    @@ -1470,22 +1480,31 @@

/*

  • call-seq:
    • enum.drop                  => array
      
    • enum.drop(n)               => array
      
    • Drops first n elements from enum, and returns rest elements
    • in an array.
    • Drops first element, or first +n+ elements, from enum, and
    • returns rest elements in an array.
    • a = [1, 2, 3, 4, 5, 0]
      
    • a.drop                # => [2, 3, 4, 5, 0]
      
    • a.drop(3)             # => [4, 5, 0]
      
    */

static VALUE
-enum_drop(VALUE obj, VALUE n)
+enum_drop(int argc, VALUE *argv, VALUE obj)
{
VALUE args[2];

  • VALUE n;
  • args[1] = NUM2ULONG(n);
  • if (argc == 0) {
  • args[1] = 1;
  • }
  • else {
  • rb_scan_args(argc, argv, “01”, &n);
  • args[1] = NUM2LONG(n);
  • }
    args[0] = rb_ary_new2(args[1]);
    rb_block_call(obj, id_each, 0, 0, drop_i, (VALUE)args);
    return args[0];
    @@ -1620,9 +1639,9 @@
    rb_define_method(rb_mEnumerable,“include?”, enum_member, 1);
    rb_define_method(rb_mEnumerable,“each_with_index”,
    enum_each_with_index, -1);
    rb_define_method(rb_mEnumerable, “zip”, enum_zip, -1);
  • rb_define_method(rb_mEnumerable, “take”, enum_take, 1);
  • rb_define_method(rb_mEnumerable, “take”, enum_take, -1);
    rb_define_method(rb_mEnumerable, “take_while”, enum_take_while, 0);
  • rb_define_method(rb_mEnumerable, “drop”, enum_drop, 1);
  • rb_define_method(rb_mEnumerable, “drop”, enum_drop, -1);
    rb_define_method(rb_mEnumerable, “drop_while”, enum_drop_while, 0);
    rb_define_method(rb_mEnumerable, “cycle”, enum_cycle, 0);

Index: test/ruby/test_array.rb

— test/ruby/test_array.rb (revision 13902)
+++ test/ruby/test_array.rb (working copy)
@@ -586,6 +586,18 @@
assert_equal(@cls[1, 2, 3], a)
end

  • def test_drop

  • assert_equal([4, 5], @cls[3, 4, 5].drop)

  • assert_equal([3, 4, 5], @cls[3, 4, 5].drop(0))

  • assert_equal([4, 5], @cls[3, 4, 5].drop(1))

  • assert_equal([5], @cls[3, 4, 5].drop(2))

  • assert_equal([], @cls[3, 4, 5].drop(3))

  • assert_equal([], @cls[3, 4, 5].drop(4))

  • assert_raise(ArgumentError) { @cls[3, 4, 5].drop(-1) }

  • assert_equal([], @cls[].drop)

  • assert_equal([], @cls[].drop(1))

  • end

  • def test_dup
    for taint in [ false, true ]
    for frozen in [ false, true ]
    @@ -1103,6 +1115,18 @@
    assert_equal(@cls[], @cls[].sort!)
    end

  • def test_take

  • assert_equal([3], @cls[3, 4, 5].take)

  • assert_equal([], @cls[3, 4, 5].take(0))

  • assert_equal([3], @cls[3, 4, 5].take(1))

  • assert_equal([3, 4], @cls[3, 4, 5].take(2))

  • assert_equal([3, 4, 5], @cls[3, 4, 5].take(3))

  • assert_equal([3, 4, 5], @cls[3, 4, 5].take(4))

  • assert_raise(ArgumentError) { @cls[3, 4, 5].take(-1) }

  • assert_equal([], @cls[].take)

  • assert_equal([], @cls[].take(1))

  • end

  • def test_to_a
    a = @cls[ 1, 2, 3 ]
    a_id = a.id

e$B1sF#$G$9!#e(B

07/11/13 e$B$Ke(B Yukihiro M.[email protected]
e$B$5$s$O=q$-$^$7$?e(B:

take_whilee$B$He(Bdrop_whilee$B$rJ,N%$7$?$N$G==J,$K$“$j$($kOC$G$O$”$ke(B
e$B$N$G$9$,e(B

e$BJ,N%$7$J$$$H$"$j$($J$$OC$J$s$G$7$g$&$+!#e(B
e$B%V%m%C%/$r>JN,$7$?$H$-e(B Enumerator e$B$rJV$9$?$a!)e(B

e$B<B:]$N$H$3$mL50z?t$Ne(Btakee$B$,@hF,$NMWAG$rJV$9$H$+!"L5e(B
e$B0z?t$Ne(Bdrope$B$,@hF,$NMWAG$rMn$H$9$H$+$O<+L@$G$J$$5$$,$7$^$9$,!"e(B

e$B$=$&46$8$k$N$O!Ve(Bdrop(n) e$B$,@hF,e(B n
e$B8D$rMn$H$9!W$H$$$&CN<1$r;}$C$F$$$k$+$ie(B
e$B$@$H;W$$$^$9!#e(B

e$B2>$K!Ve(Bdrop
e$B$O@hF,$rMn$H$9!W$H$$$&CN<1$,@h$K$“$k$H$9$l$P!”$=$N3HD%$H$7$Fe(B
e$B!Ve(Bdrop(n) e$B$O@hF,e(B n
e$B8D$rMn$H$9!W$N$,<+A3$K46$8$i$l$k$N$G$O$J$$$G$7$g$&$+!#e(B
first e$B$He(B first(n) e$B$N4X78$N$h$&$K!#e(B

e$BLdBj$O!Ve(Bdrop(n) e$B$O@hF,e(B n
e$B8D$rMn$H$9!W$H$$$&CN<1$,0lHLE*$+$I$&$+!"$^$?$Oe(B
drop
e$B$H$$$&L>A0$+$i$=$&$$$&5sF0$,%$%a!<%8$5$l$k$+$I$&$+$@$H;W$$$^$9$,!"e(B
e$B$=$s$J%$%a!<%8$r$9$k$N$Oe(B (e$B9,$+IT9,$+e(B) e$B0lIt$Ne(B Haskeller
e$B$@$1$@$H;W$$$^$9!#e(B

e$B$H$$$&$o$1$G!"L50z?t$Ne(B drop
e$B$O:#$J$i$^$@<u$1F~$l$i$l$k$H;W$$$^$9!#e(B
1.9 e$B%j%j!<%9$Ge(B drop(n) e$B$,CN$lEO$C$?$i<jCY$l$+$b!#e(B

e$B0lJ}L50z?te(B take
e$B$K$D$$$F$O!";H$$$?$$>u67$,LGB?$K$J$5$=$&$J$N$GL5$/$F$be(B
e$B$$$$$s$G$9$,!"e(Bdrop
e$B$@$1L50z?t$J$N$b%P%i%s%9$,0-$$$J$!$H;W$C$?$N$G$7$?!#e(B