Почему я не могу установить значение переменной экземпляра таким образом

#ruby

#ruby

Вопрос:

Я пытаюсь понять, как использовать методы установки в Ruby, но я не понимаю, почему этот код не работает. Разве это не работает, потому что я уже установил цену book , когда создавал объект book? Если я изменю строку, о которой идет речь book.price = book.price 10.00 , на то, что она работает так, как ожидалось. Почему? Почему я не могу просто изменить значение, просто передав другой параметр?

 class BookInStock
    attr_reader   :isbn
    attr_accessor :price

    def initialize(isbn,price)
        @isbn  = isbn
        @price = Float(price) 
    end

    def isbn
        @isbn
    end


    def to_s
        "ISBN: #{@isbn}, price: #{@price}"
    end

end

book = BookInStock.new("isbn",38.5)
puts "The books cost: #{book.price} and the name is: #{book.isbn}"
book.price = book.price 150 # THIS LINE IS BROKEN WHY?
puts "The new price is "
puts "The new price of the book is #{book.price}"
 

Ответ №1:

Короче говоря, потому что

 book.price
 

это метод, принимающий НУЛЕВЫЕ аргументы, возвращающий цену книги. Однако

 book.price=
 

это метод с ОДНИМ аргументом, который задает значение.

Последний метод можно вызвать следующим образом:

 book.price = 150
 

Вы пытались вызвать средство получения с аргументом. Вы не можете вызвать book.price 150 .

Ответ №2:

Вы делаете это так:

 book.price = 150
 

Считыватель атрибутов не принимает никаких параметров и book.price не является именем автора, то price= есть .

Если вы хотите передать новую цену в качестве более очевидного параметра для вашего writer, одним из способов может быть вызов, подобный этому:

 book.send 'price=', 160