2016-08-18 4 views
1

мне действительно нужно использовать что-то похожее на Single метод, который:Рубин Enumerator «Единый» метод

Возвращает единственный элемент последовательности и генерирует исключение, если не совсем один элемент в последовательности.

Очевидно, что я могу добавить расширение/уточнение для удобства.

Но что-то подобное уже существует? Возможно, в ActiveSupport или в другой библиотеке?

ответ

2

Нет, ничего в стандартной библиотеке (и не ActiveSupport, я считаю), но достаточно просто реализовать.

module EnumeratorWithSingle 
    class TooManyValuesException < StandardError; end 
    class NotEnoughValuesException < StandardError; end 

    refine Enumerator do 
    def single 
     val = self.next 
     begin 
     self.next 
     raise TooManyValuesException 
     rescue StopIteration 
     val 
     end 
    rescue StopIteration 
     raise NotEnoughValuesException 
    end 
    end 
end 

module Test 
    using EnumeratorWithSingle  
    puts [1].each.single   # 1 
    puts [1, 2].each.single   # EnumeratorWithSingle::TooManyValuesException 
end 
+0

'e = [1, 2] .each; e.next; помещает e.single' отпечатки 2, что может не быть желаемым результатом. – steenslag

+0

Это хороший способ справиться с проблемой, но разве вы не хотите, чтобы 'начинал' как первую строку' single'? Прямо сейчас, если 'self # => [] .to_enum',' self.next' вызовет исключение 'StopIteration', которое не будет обработано. –

+0

@sreenslag делает интересный момент. Возможно, первая строка 'single' должна быть' self_cpy = dup', а затем работать с 'self.cpy'. –

Смежные вопросы