Commit b0fd5229 authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto

Merge pull request #2139 from suzukaze/add-array.select_bang

Add Array#select_bang
parents e1f4e021 cdef46e3
...@@ -657,4 +657,34 @@ class Array ...@@ -657,4 +657,34 @@ class Array
end end
self self
end end
##
# call-seq:
# ary.select! {|item| block } -> ary or nil
# ary.select! -> Enumerator
#
# Invokes the given block passing in successive elements from +self+,
# deleting elements for which the block returns a +false+ value.
#
# If changes were made, it will return +self+, otherwise it returns +nil+.
#
# See also Array#keep_if
#
# If no block is given, an Enumerator is returned instead.
def select!(&block)
return to_enum :select! unless block_given?
idx = 0
len = self.size
while idx < self.size do
if block.call(self[idx])
idx += 1
else
self.delete_at(idx)
end
end
return nil if self.size == len
self
end
end end
...@@ -266,3 +266,17 @@ assert("Array#keep_if") do ...@@ -266,3 +266,17 @@ assert("Array#keep_if") do
assert_equal [4, 5], a.keep_if { |val| val > 3 } assert_equal [4, 5], a.keep_if { |val| val > 3 }
assert_equal [4, 5], a assert_equal [4, 5], a
end end
assert("Array#select!") do
a = [1, 2, 3, 4, 5]
assert_nil a.select! { true }
assert_equal [1, 2, 3, 4, 5], a
a = [1, 2, 3, 4, 5]
assert_equal [], a.select! { false }
assert_equal [], a
a = [1, 2, 3, 4, 5]
assert_equal [4, 5], a.select! { |val| val > 3 }
assert_equal [4, 5], a
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment