Próbuję zaimplementować klasę BinaryTree w Ruby, ale dostaję błąd stack level too deep
, chociaż nie wydaje się być za pomocą dowolnego rekursji w danym kawałku kodu:wykonawcze Binary Tree in Ruby
1. class BinaryTree
2. include Enumerable
3.
4. attr_accessor :value
5.
6. def initialize(value = nil)
7. @value = value
8. @left = BinaryTree.new # stack level too deep here
9. @right = BinaryTree.new # and here
10. end
11.
12. def empty?
13. (self.value == nil) ? true : false
14. end
15.
16. def <<(value)
17. return self.value = value if self.empty?
18.
19. test = self.value <=> value
20. case test
21. when -1, 0
22. self.right << value
23. when 1
24. self.left << value
25. end
26. end # <<
27.
28. end
Edycja: Moje pytanie nieco się zmieniło. Aktualne ustawienie kod daje mi błąd w wierszu 8. stack level too deep
Jednakże, jeśli zatrudniają rozwiązanie Ed S.
@left = @right = nil
wówczas metoda <<
narzeka mówiąc: undefined method '<<' for nil:NilClass (NoMethodError)
na linii 22.
Czy ktoś może sugerować jak rozwiązać ten problem? Mój pomysł jest taki, że gdybym mógł jakoś powiedzieć klasie BinaryTree
, że zmienne są instancjami BinaryTree
(tj. Ich typ to BinaryTree
), wszystko byłoby dobrze. Czy się mylę?
każdym razem dzwonić BinaryTree.new, to uderza 'metody initialize' i wywołuje inny BinaryTree.new i powtarza wiecznie. Dlatego Twój stos jest przepełniony – Edmund