[前][次][番号順一覧][スレッド一覧]

ruby-changes:17804

From: knu <ko1@a...>
Date: Wed, 17 Nov 2010 18:29:56 +0900 (JST)
Subject: [ruby-changes:17804] Ruby:r29815 (ruby_1_8): * array.c (rb_ary_sort_by_bang): Add Array#sort_by!.

knu	2010-11-17 18:29:49 +0900 (Wed, 17 Nov 2010)

  New Revision: 29815

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=29815

  Log:
    * array.c (rb_ary_sort_by_bang): Add Array#sort_by!.

  Modified files:
    branches/ruby_1_8/ChangeLog
    branches/ruby_1_8/NEWS
    branches/ruby_1_8/array.c
    branches/ruby_1_8/test/ruby/test_array.rb

Index: ruby_1_8/array.c
===================================================================
--- ruby_1_8/array.c	(revision 29814)
+++ ruby_1_8/array.c	(revision 29815)
@@ -1845,8 +1845,43 @@
     return ary;
 }
 
+
+static VALUE sort_by_i _((VALUE));
+
+static VALUE
+sort_by_i(i)
+    VALUE i;
+{
+    return rb_yield(i);
+}
+
 /*
  *  call-seq:
+ *     ary.sort_by! {| obj | block }    -> ary
+ *     ary.sort_by!                     -> an_enumerator
+ *
+ *  Sorts +self+ in place using a set of keys generated by mapping the
+ *  values in +self+ through the given block.
+ *
+ *  If no block is given, an enumerator is returned instead.
+ *
+ */
+
+static VALUE
+rb_ary_sort_by_bang(ary)
+    VALUE ary;
+{
+    VALUE sorted;
+
+    RETURN_ENUMERATOR(ary, 0, 0);
+    rb_ary_modify(ary);
+    sorted = rb_block_call(ary, rb_intern("sort_by"), 0, 0, sort_by_i, 0);
+    rb_ary_replace(ary, sorted);
+    return ary;
+}
+
+/*
+ *  call-seq:
  *     array.collect {|item| block }  -> an_array
  *     array.map     {|item| block }  -> an_array
  *
@@ -3903,6 +3938,7 @@
     rb_define_method(rb_cArray, "reverse!", rb_ary_reverse_bang, 0);
     rb_define_method(rb_cArray, "sort", rb_ary_sort, 0);
     rb_define_method(rb_cArray, "sort!", rb_ary_sort_bang, 0);
+    rb_define_method(rb_cArray, "sort_by!", rb_ary_sort_by_bang, 0);
     rb_define_method(rb_cArray, "collect", rb_ary_collect, 0);
     rb_define_method(rb_cArray, "collect!", rb_ary_collect_bang, 0);
     rb_define_method(rb_cArray, "map", rb_ary_collect, 0);
Index: ruby_1_8/NEWS
===================================================================
--- ruby_1_8/NEWS	(revision 29814)
+++ ruby_1_8/NEWS	(revision 29815)
@@ -70,6 +70,10 @@
 
     New method which replaces #choice.
 
+  * Array#sort_by!
+
+    New method.
+
   * Enumerable#each_entry
 
     New method.
Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog	(revision 29814)
+++ ruby_1_8/ChangeLog	(revision 29815)
@@ -1,3 +1,7 @@
+Wed Nov 17 18:28:27 2010  Akinori MUSHA  <knu@i...>
+
+	* array.c (rb_ary_sort_by_bang): Add Array#sort_by!.
+
 Mon Nov  1 00:58:00 2010  Akinori MUSHA  <knu@i...>
 
 	* ext/digest/digest.c (rb_digest_class_init): Define
Index: ruby_1_8/test/ruby/test_array.rb
===================================================================
--- ruby_1_8/test/ruby/test_array.rb	(revision 29814)
+++ ruby_1_8/test/ruby/test_array.rb	(revision 29815)
@@ -1334,4 +1334,10 @@
       end
       )
   end
+
+  def test_sort_by!
+    a = [1,3,5,2,4]
+    a.sort_by! {|x| -x }
+    assert_equal([5,4,3,2,1], a)
+  end
 end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]