2013-09-29 3 views
12

私は次のコードを持っている:ルビー、あまりにも深いスタックレベル(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 

をこのすべてがうまく機能し、220を生成するが、私は二行目のattr_accessorを交換する場合:価格と:

def price 
    @price = price 
end 

スタックレベルが深すぎる(SystemStackError)エラーが発生します。どうしたの?私はInteger(price * 100 + 0.5)をメソッド呼び出し価格の代わりに@priceに置き換えることができますが、私はそれをOOPの理由と同じように保ちたいと思います。このコードをattr_accessorなしで動作させるにはどうすればよいですか?

答えて

25

あなたの次のコード

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

は決してstopable再帰を作成し、。

このコードをattr_accessorなしで動作させるにはどうすればよいですか?

あなたはあなたがする必要がある

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

'DEF価格=(価格)'も結構です探しているものです。 – steenslag

+0

@steenslagはい、あなたは正しいです! –

+0

ありがとう、私は推測して、わかりやすくするためにdef price =(new_price)を使用します。 – daremkd

5

として記述する必要があります。

@price = self.price 

をごオブジェクト属性priceとあなたのメソッドのパラメータpriceを区別します。

0

read_attributeあなたは

def price 
    @price = read_attribute(:price) 
end