1. ホーム
  2. ruby

[解決済み] Ruby、スタックレベルが深すぎる (SystemStackError)

2022-02-05 18:51:14

質問

次のようなコードがあります。

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を生成します。しかし、2行目のattr_accessor :priceを置き換えると、以下のようになります。

def price
  @price = price
end

スタックレベルが深すぎる(SystemStackError)エラーが発生します。どうなっているのでしょうか?Integer(price*100 + 0.5)をメソッド呼び出しのpriceの代わりに@priceに置き換えればいいのは分かっていますが、OOPの観点からこのままにしておきたいのです。attr_accessorなしでこのコードをそのまま動作させるにはどうしたらよいでしょうか?

解決方法は?

以下のコード

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

決して止めることのできない再帰を作成します。

<ブロッククオート

attr_accessorなしでこのコードをそのまま動作させるにはどうしたらいいですか?

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

def price=(price)
  @price = price
end
def price
  @price 
end