2013-09-29 13 views
12

Mam następujący kod:Ruby, poziom stos zbyt głębokie (SystemStackError)

class BookPrice 
    attr_accessor :price 
    def initialize(price) 
    @price = price 
    end 
    def price_in_cents 
    Integer(price*100 + 0.5) 
    end 
end 

b = BookPrice.new(2.20) 
puts b.price_in_cents 

To wszystko działa dobrze i produkuje 220. Ale kiedy wymienić drugą linię attr_accessor: Cena z:

def price 
    @price = price 
end 

Występuje błąd zbyt wysokiego poziomu stosu (SystemStackError). Co się dzieje? Wiem, że mogę zastąpić Integer (cena * 100 + 0,5) z @price zamiast ceny wywołania metody, ale chcę zachować to tak, jak to jest z przyczyn OOP. Jak mogę sprawić, aby ten kod działał tak, jak jest, bez attr_accessor?

Odpowiedz

25

poniżej swój kod

def price 
    @price = price # <~~ method name you just defined with `def` keyword. 
end 

Tworzy nigdy stopable rekursji ,.

Jak sprawić, aby kod działał tak, jak jest, bez attr_accessor?

Musisz napisać jak

def price=(price) 
    @price = price 
end 
def price 
    @price 
end 
+2

'cenie def = (cena)' jest również w porządku. – steenslag

+0

@steenslag Tak, masz rację !! –

+0

Dzięki, zgaduję, że użyję def cena = (new_price) dla jasności. – daremkd

5

Co trzeba zrobić:

@price = self.price 

odróżnić atrybutu obiektu price i metodę parametru price.

0

read_attribute jest to, czego szukasz

def price 
    @price = read_attribute(:price) 
end 
Powiązane problemy