* 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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16771 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
a5c9928320
commit
ea40df71fc
10
ChangeLog
10
ChangeLog
@ -1,3 +1,13 @@
|
|||||||
|
Tue Jun 3 13:41:08 2008 Akinori MUSHA <knu@iDaemons.org>
|
||||||
|
|
||||||
|
* 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@ruby-lang.org>
|
Tue Jun 3 13:35:40 2008 NAKAMURA Usaku <usa@ruby-lang.org>
|
||||||
|
|
||||||
* process.c (run_exec_pgroup): C99 ism.
|
* process.c (run_exec_pgroup): C99 ism.
|
||||||
|
32
lib/set.rb
32
lib/set.rb
@ -250,21 +250,41 @@ class Set
|
|||||||
# Deletes every element of the set for which block evaluates to
|
# Deletes every element of the set for which block evaluates to
|
||||||
# true, and returns self.
|
# true, and returns self.
|
||||||
def delete_if
|
def delete_if
|
||||||
|
block_given? or return enum_for(__method__)
|
||||||
@hash.delete_if { |o,| yield(o) }
|
@hash.delete_if { |o,| yield(o) }
|
||||||
self
|
self
|
||||||
end
|
end
|
||||||
|
|
||||||
# Do collect() destructively.
|
# Calls the given block once for each element and returns a new set
|
||||||
def collect!
|
# containing the values returned by the block.
|
||||||
|
def collect
|
||||||
|
block_given? or return enum_for(__method__)
|
||||||
set = self.class.new
|
set = self.class.new
|
||||||
each { |o| set << yield(o) }
|
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
|
end
|
||||||
alias map! collect!
|
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
|
# Equivalent to Set#delete_if, but returns nil if no changes were
|
||||||
# made.
|
# made.
|
||||||
def reject!
|
def reject!
|
||||||
|
block_given? or return enum_for(__method__)
|
||||||
n = size
|
n = size
|
||||||
delete_if { |o| yield(o) }
|
delete_if { |o| yield(o) }
|
||||||
size == n ? nil : self
|
size == n ? nil : self
|
||||||
@ -356,6 +376,8 @@ class Set
|
|||||||
# # 2001=>#<Set: {"c.rb", "d.rb", "e.rb"}>,
|
# # 2001=>#<Set: {"c.rb", "d.rb", "e.rb"}>,
|
||||||
# # 2002=>#<Set: {"f.rb"}>}
|
# # 2002=>#<Set: {"f.rb"}>}
|
||||||
def classify # :yields: o
|
def classify # :yields: o
|
||||||
|
block_given? or return enum_for(__method__)
|
||||||
|
|
||||||
h = {}
|
h = {}
|
||||||
|
|
||||||
each { |i|
|
each { |i|
|
||||||
@ -365,6 +387,7 @@ class Set
|
|||||||
|
|
||||||
h
|
h
|
||||||
end
|
end
|
||||||
|
alias group_by classify
|
||||||
|
|
||||||
# Divides the set into a set of subsets according to the commonality
|
# Divides the set into a set of subsets according to the commonality
|
||||||
# defined by the given block.
|
# defined by the given block.
|
||||||
@ -383,6 +406,8 @@ class Set
|
|||||||
# # #<Set: {3, 4}>,
|
# # #<Set: {3, 4}>,
|
||||||
# # #<Set: {6}>}>
|
# # #<Set: {6}>}>
|
||||||
def divide(&func)
|
def divide(&func)
|
||||||
|
func or return enum_for(__method__)
|
||||||
|
|
||||||
if func.arity == 2
|
if func.arity == 2
|
||||||
require 'tsort'
|
require 'tsort'
|
||||||
|
|
||||||
@ -501,6 +526,7 @@ class SortedSet < Set
|
|||||||
end
|
end
|
||||||
|
|
||||||
def delete_if
|
def delete_if
|
||||||
|
block_given? or return enum_for(__method__)
|
||||||
n = @hash.size
|
n = @hash.size
|
||||||
@hash.delete_if { |o,| yield(o) }
|
@hash.delete_if { |o,| yield(o) }
|
||||||
@keys = nil if @hash.size != n
|
@keys = nil if @hash.size != n
|
||||||
|
Loading…
x
Reference in New Issue
Block a user