summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-array-ext/mrblib
diff options
context:
space:
mode:
authorJun Hiroe <[email protected]>2014-04-25 18:57:01 +0900
committerJun Hiroe <[email protected]>2014-04-25 18:57:20 +0900
commitd6414fe112859192f953ce9e5f185971839fb495 (patch)
tree7ff07079d1af929667de83046979cfe560f5fa40 /mrbgems/mruby-array-ext/mrblib
parent49abcd4c0281d00030a540f7426de72882806dd4 (diff)
downloadmruby-d6414fe112859192f953ce9e5f185971839fb495.tar.gz
mruby-d6414fe112859192f953ce9e5f185971839fb495.zip
Add Array#keep_if
Diffstat (limited to 'mrbgems/mruby-array-ext/mrblib')
-rw-r--r--mrbgems/mruby-array-ext/mrblib/array.rb30
1 files changed, 30 insertions, 0 deletions
diff --git a/mrbgems/mruby-array-ext/mrblib/array.rb b/mrbgems/mruby-array-ext/mrblib/array.rb
index 67f7e51a7..9ef7eb166 100644
--- a/mrbgems/mruby-array-ext/mrblib/array.rb
+++ b/mrbgems/mruby-array-ext/mrblib/array.rb
@@ -627,4 +627,34 @@ class Array
end
self
end
+
+ ##
+ # call-seq:
+ # ary.keep_if { |item| block } -> ary
+ # ary.keep_if -> Enumerator
+ #
+ # Deletes every element of +self+ for which the given block evaluates to
+ # +false+.
+ #
+ # See also Array#select!
+ #
+ # If no block is given, an Enumerator is returned instead.
+ #
+ # a = [1, 2, 3, 4, 5]
+ # a.keep_if { |val| val > 3 } #=> [4, 5]
+
+ def keep_if(&block)
+ return to_enum :keep_if 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
+ self
+ end
end