为什么我不能像这样设置实例变量的值

时间:2011-10-29 06:52:08

标签: ruby

我正在尝试理解如何在Ruby中使用setter方法,但我不明白为什么这段代码不起作用。它不起作用,因为我在创建图书对象时已经设定了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}"

2 个答案:

答案 0 :(得分:2)

简而言之,因为

book.price

是一种采用ZERO参数返回书籍价格的方法。然而

book.price=

是设置值的ONE参数的方法。

后一种方法可以像这样调用:

book.price = 150

你试图用一个参数调用getter。您无法拨打book.price 150

答案 1 :(得分:0)

你这样做:

book.price = 150

属性读取器不接受任何参数,而book.price不是作者的名称,即price=

如果你想把新价格作为一个更明显的参数传递给你的作家,一种方法是这样的调用:

book.send 'price=', 160