Ruby, уровень стека слишком глубокий (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 (цена * 100 + 0,5) на @price вместо цены вызова метода, но я хочу сохранить его таким, какой он есть по причинам ООП. Как я могу заставить этот код работать так, как он работает без attr_accessor?

Ответ 1

Ваш ниже код

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

Ответ 2

Вам нужно сделать:

@price = self.price

чтобы различать атрибут объекта price и ваш параметр метода price.

Ответ 3

read_attribute - это то, что вы ищете

def price 
  @price = read_attribute(:price)
end