2013-09-29 5 views
12

Ich habe den folgenden Code:Ruby Stack-Ebene zu tief (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 

Das alles funktioniert gut und produziert 220 Aber wenn ich ersetzen die zweite Zeile attr_accessor: Preis mit:

def price 
    @price = price 
end 

Ich bekomme Stack-Level zu tief (SystemStackError) Fehler. Was ist los? Ich weiß, dass ich Integer (Preis * 100 + 0,5) mit @Price anstelle des Methodenaufrufpreises ersetzen kann, aber ich möchte es so behalten, wie es für OOP-Gründe ist. Wie kann ich diesen Code ohne attr_accessor so machen, wie er ist?

Antwort

25

Ihr Code unten

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

Erzeugt nie stoppbare Rekursion ,.

Wie kann ich diesen Code ohne attr_accessor so einrichten, wie er ist?

Sie müssen schreiben, wie

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

'def Preis = (Preis)' suchen, ist auch in Ordnung. – steenslag

+0

@steenslag Ja, Sie haben Recht !! –

+0

Danke, ich nehme an, ich verwende def price = (new_price) aus Gründen der Klarheit. – daremkd

5

Sie tun müssen:

@price = self.price 

price zwischen Ihrem Objekt Attribut price und Ihre Methodenparameter zu unterscheiden.

0

read_attribute ist, was Sie für

def price 
    @price = read_attribute(:price) 
end