2013-10-09 4 views
1

У меня есть класс с этим методом, который должен возвращать Enumerator, если ни один блок не указан или не перечисляется, если он задан. Это просто симуляция метода Array.each. Перечисление работает правильно.Возвращающийся счетчик по собственному усмотрению

def each 
    if (block_given?) 
     0.upto(size - 1) do |x| 
     yield @data[x] 
     end 
    end 
    end 

И тестируется остроумие этот код:

it "should return Enumerator" do 
    res = subject.each 
    res.class.should eq Enumerator 
    res.to_a.should eq data 
end 

Ошибка "Сбой/Ошибка: res.class.should эк Enumerator"

ЗАПРЕЩЕНО использовать @data. каждый (или собирать, карту и т. д.), я должен сам реализовать его. Я провел около двух часов в Интернете, и я до сих пор не знаю, как это сделать, потому что в каждом примере они просто делегируют «каждую» функцию уже законченному классу, например Array ... Или они просто не заботятся о возвращении «Enumerator msgstr "нет никакого блока.


РЕШЕНИЕ:

def each 
    if (block_given?) 
     0.upto(size - 1) do |x| 
     yield @data[x] 
     end 
     self 
    else 
     to_enum(:each) 
    end 
    end 

ответ

2

Ваш первый вопрос в том, что вы явно не возвращая ничего из вашего метода. В случае, когда блок передан, соглашение для each должно вернуть self, как это делает Array.

В случае, если блок не указан, стандартным способом создания Enumerator является метод Kernel#to_enum. Так, например, вы можете использовать следующие значения в качестве первой линии вашего метода, как это рекомендовано в What's the best way to return an Enumerator::Lazy when your class doesn't define #each?

return to_enum(:each) unless block_given? 
+0

Это работает, ТХ :). – libik

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