2015-01-13 3 views
1

Я пытаюсь выполнить следующий код:уровень стека слишком глубоко: SystemStackError

class Array 

    def each 
     for i in self 
      yield(i) 
     end 
    end 

end 

[1,2,3,4].each {|i| puts i*i} 

, когда я запускаю этот код я получаю следующее сообщение об ошибке:

stack level too deep (SystemStackError) 

Но следующий код выполнить успешно:

class Array 

    def each 
      yield(self[0]) 
      yield(self[1]) 
      yield(self[2]) 
      yield(self[3]) 
    end 

end 

[1,2,3,4].each {|i| puts i*i} 

Выход:

1 
4 
9 
16 
+2

Я думаю, это потому, что 'для ... в' использует' each' внутренне поэтому вы создаете рекурсию. Попробуйте называть ваш метод, чтобы он не сталкивался со встроенным методом. –

+0

Да, это работает, если я меняю «каждый» на «aech» –

+1

Если целью этого упражнения является научиться реализовывать «каждый» самостоятельно, тогда вы просто обманываете. Вы в основном просто вызываете встроенный 'каждый' снова, просто в маскировке' for'/'in'. –

ответ

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