summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-enum-ext/mrblib/enum.rb
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-03-24 00:08:01 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-03-24 00:08:01 +0900
commit2a771760bed104433f7b95732595bfa7573fb9fa (patch)
treef3dcd7df41e44858946cbe23123c832032570035 /mrbgems/mruby-enum-ext/mrblib/enum.rb
parente2bab8c71be55def3a9c9e7f3a234c43cd2bea2f (diff)
parent919ca8f42beb9d010afb35a0c715bee043d31ac3 (diff)
downloadmruby-2a771760bed104433f7b95732595bfa7573fb9fa.tar.gz
mruby-2a771760bed104433f7b95732595bfa7573fb9fa.zip
Merge pull request #1926 from suzukaze/add-enum.one
Add Enumerable#one?
Diffstat (limited to 'mrbgems/mruby-enum-ext/mrblib/enum.rb')
-rw-r--r--mrbgems/mruby-enum-ext/mrblib/enum.rb29
1 files changed, 29 insertions, 0 deletions
diff --git a/mrbgems/mruby-enum-ext/mrblib/enum.rb b/mrbgems/mruby-enum-ext/mrblib/enum.rb
index a228abb0b..4f5166b03 100644
--- a/mrbgems/mruby-enum-ext/mrblib/enum.rb
+++ b/mrbgems/mruby-enum-ext/mrblib/enum.rb
@@ -439,4 +439,33 @@ module Enumerable
end
true
end
+
+ ##
+ # call-seq:
+ # enum.one? [{ |obj| block }] -> true or false
+ #
+ # Passes each element of the collection to the given block. The method
+ # returns <code>true</code> if the block returns <code>true</code>
+ # exactly once. If the block is not given, <code>one?</code> will return
+ # <code>true</code> only if exactly one of the collection members is
+ # true.
+ #
+ # %w(ant bear cat).one? { |word| word.length == 4 } #=> true
+ # %w(ant bear cat).one? { |word| word.length > 4 } #=> false
+ # %w(ant bear cat).one? { |word| word.length < 4 } #=> false
+ # [nil, true, 99].one? #=> false
+ # [nil, true, false].one? #=> true
+ #
+
+ def one?(&block)
+ count = 0
+ self.each do |*val|
+ if block
+ count += 1 if block.call(*val)
+ else
+ count += 1 if val.__svalue
+ end
+ end
+ count == 1 ? true : false
+ end
end