diff options
| author | Jun Hiroe <[email protected]> | 2014-04-25 18:57:01 +0900 |
|---|---|---|
| committer | Jun Hiroe <[email protected]> | 2014-04-25 18:57:20 +0900 |
| commit | d6414fe112859192f953ce9e5f185971839fb495 (patch) | |
| tree | 7ff07079d1af929667de83046979cfe560f5fa40 | |
| parent | 49abcd4c0281d00030a540f7426de72882806dd4 (diff) | |
| download | mruby-d6414fe112859192f953ce9e5f185971839fb495.tar.gz mruby-d6414fe112859192f953ce9e5f185971839fb495.zip | |
Add Array#keep_if
| -rw-r--r-- | mrbgems/mruby-array-ext/mrblib/array.rb | 30 | ||||
| -rw-r--r-- | mrbgems/mruby-array-ext/test/array.rb | 14 |
2 files changed, 44 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 diff --git a/mrbgems/mruby-array-ext/test/array.rb b/mrbgems/mruby-array-ext/test/array.rb index 47ffa00cf..c76423522 100644 --- a/mrbgems/mruby-array-ext/test/array.rb +++ b/mrbgems/mruby-array-ext/test/array.rb @@ -252,3 +252,17 @@ assert("Array#delete_if") do a = [ 1, 2, 3, 4, 5 ] assert_equal [1, 2, 3], a.delete_if { |val| val > 3 } end + +assert("Array#keep_if") do + a = [1, 2, 3, 4, 5] + assert_equal [1, 2, 3, 4, 5], a.keep_if { true } + assert_equal [1, 2, 3, 4, 5], a + + a = [1, 2, 3, 4, 5] + assert_equal [], a.keep_if { false } + assert_equal [], a + + a = [1, 2, 3, 4, 5] + assert_equal [4, 5], a.keep_if { |val| val > 3 } + assert_equal [4, 5], a +end |
