diff options
| -rw-r--r-- | mrbgems/mruby-enum-ext/mrblib/enum.rb | 26 | ||||
| -rw-r--r-- | mrbgems/mruby-enum-ext/test/enum.rb | 8 |
2 files changed, 34 insertions, 0 deletions
diff --git a/mrbgems/mruby-enum-ext/mrblib/enum.rb b/mrbgems/mruby-enum-ext/mrblib/enum.rb index 8a2cdd5f1..a228abb0b 100644 --- a/mrbgems/mruby-enum-ext/mrblib/enum.rb +++ b/mrbgems/mruby-enum-ext/mrblib/enum.rb @@ -413,4 +413,30 @@ module Enumerable end [min, max] end + + ## + # call-seq: + # enum.none? [{ |obj| block }] -> true or false + # + # Passes each element of the collection to the given block. The method + # returns <code>true</code> if the block never returns <code>true</code> + # for all elements. If the block is not given, <code>none?</code> will return + # <code>true</code> only if none of the collection members is true. + # + # %w(ant bear cat).none? { |word| word.length == 5 } #=> true + # %w(ant bear cat).none? { |word| word.length >= 4 } #=> false + # [].none? #=> true + # [nil, false].none? #=> true + # [nil, true].none? #=> false + + def none?(&block) + self.each do |*val| + if block + return false if block.call(*val) + else + return false if val.__svalue + end + end + true + end end diff --git a/mrbgems/mruby-enum-ext/test/enum.rb b/mrbgems/mruby-enum-ext/test/enum.rb index 4dfa2fec0..d0f47448f 100644 --- a/mrbgems/mruby-enum-ext/test/enum.rb +++ b/mrbgems/mruby-enum-ext/test/enum.rb @@ -94,3 +94,11 @@ end assert("Enumerable#minmax_by") do assert_equal ["dog", "albatross"], %w(albatross dog horse).minmax_by { |x| x.length } end + +assert("Enumerable#none?") do + assert_true %w(ant bear cat).none? { |word| word.length == 5 } + assert_false %w(ant bear cat).none? { |word| word.length >= 4 } + assert_true [].none? + assert_true [nil, false].none? + assert_false [nil, true].none? +end |
