2011-10-29 7 views
1

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

book.price 

は書籍の価格を返すZEROの引数を取る方法であるため。しかし

book.price= 

は値を設定する1つの引数のメソッドです。

後者の方法は次のように呼び出すことができます。

book.price = 150 

あなたは引数でゲッターを呼び出すようにしようとしていました。 book.price 150に電話をかけることはできません。

+0

ああ! – lampShade

0

あなたはこのようにそれを実行します。

book.price = 150 

属性リーダーがパラメータを取らないとbook.priceは作家の名前ではありません、それはprice=です。

あなたはライターに、より明白なパラメータとして新しい価格を渡したい場合は、一つの方法は、このような呼び出しになります:私は今見る、

book.send 'price=', 160 
関連する問題