From 919ca8f42beb9d010afb35a0c715bee043d31ac3 Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Sun, 23 Mar 2014 23:44:40 +0900 Subject: Add Enumerable#one? --- mrbgems/mruby-enum-ext/mrblib/enum.rb | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'mrbgems/mruby-enum-ext/mrblib/enum.rb') 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 true if the block returns true + # exactly once. If the block is not given, one? will return + # true 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 -- cgit v1.2.3