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

ruby-changes:5272

From: knu <ko1@a...>
Date: Tue, 3 Jun 2008 13:42:52 +0900 (JST)
Subject: [ruby-changes:5272] Ruby:r16771 (trunk): * lib/set.rb (Set#collect, Set#select): Override Enumerable

knu	2008-06-03 13:42:32 +0900 (Tue, 03 Jun 2008)

  New Revision: 16771

  Modified files:
    trunk/ChangeLog
    trunk/lib/set.rb

  Log:
    * lib/set.rb (Set#collect, Set#select): Override Enumerable
      methods and make them return a set. [ruby-core:17055]
      (Set#delete_if, Set#collect!, Set#reject!, Set#classify)
      (Set#divide, Set#delete_if): Return an enumerator if no block is
      given.
      (Set#classify): Define an alias `group_by' to override that of
      Enumerable.


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=16771&r2=16770&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/set.rb?r1=16771&r2=16770&diff_format=u

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 16770)
+++ ChangeLog	(revision 16771)
@@ -1,3 +1,13 @@
+Tue Jun  3 13:41:08 2008  Akinori MUSHA  <knu@i...>
+
+	* lib/set.rb (Set#collect, Set#select): Override Enumerable
+	  methods and make them return a set. [ruby-core:17055]
+	  (Set#delete_if, Set#collect!, Set#reject!, Set#classify)
+	  (Set#divide, Set#delete_if): Return an enumerator if no block is
+	  given.
+	  (Set#classify): Define an alias `group_by' to override that of
+	  Enumerable.
+
 Tue Jun  3 13:35:40 2008  NAKAMURA Usaku  <usa@r...>
 
 	* process.c (run_exec_pgroup): C99 ism.
Index: lib/set.rb
===================================================================
--- lib/set.rb	(revision 16770)
+++ lib/set.rb	(revision 16771)
@@ -250,21 +250,41 @@
   # Deletes every element of the set for which block evaluates to
   # true, and returns self.
   def delete_if
+    block_given? or return enum_for(__method__)
     @hash.delete_if { |o,| yield(o) }
     self
   end
 
-  # Do collect() destructively.
-  def collect!
+  # Calls the given block once for each element and returns a new set
+  # containing the values returned by the block.
+  def collect
+    block_given? or return enum_for(__method__)
     set = self.class.new
     each { |o| set << yield(o) }
-    replace(set)
   end
+  alias map collect
+
+  # Replaces the values with ones returned by collect().
+  def collect!
+    block_given? or return enum_for(__method__)
+    replace(collect)
+  end
   alias map! collect!
 
+  # Calls the given block once for each element and returns a new set
+  # containing those elements for which the block returns a true
+  # value.
+  def select
+    block_given? or return enum_for(__method__)
+    set = self.class.new
+    each { |o| set << o if yield(o) }
+    set
+  end
+
   # Equivalent to Set#delete_if, but returns nil if no changes were
   # made.
   def reject!
+    block_given? or return enum_for(__method__)
     n = size
     delete_if { |o| yield(o) }
     size == n ? nil : self
@@ -356,6 +376,8 @@
   #             #     2001=>#<Set: {"c.rb", "d.rb", "e.rb"}>,
   #             #     2002=>#<Set: {"f.rb"}>}
   def classify # :yields: o
+    block_given? or return enum_for(__method__)
+
     h = {}
 
     each { |i|
@@ -365,6 +387,7 @@
 
     h
   end
+  alias group_by classify
 
   # Divides the set into a set of subsets according to the commonality
   # defined by the given block.
@@ -383,6 +406,8 @@
   #             #            #<Set: {3, 4}>,
   #             #            #<Set: {6}>}>
   def divide(&func)
+    func or return enum_for(__method__)
+
     if func.arity == 2
       require 'tsort'
 
@@ -501,6 +526,7 @@
 	  end
 
 	  def delete_if
+            block_given? or return enum_for(__method__)
 	    n = @hash.size
 	    @hash.delete_if { |o,| yield(o) }
 	    @keys = nil if @hash.size != n

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

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