2013-11-23 157 views
0
class​ BookInStock 
    attr_reader :isbn, :price 
    ​def​ initialize(isbn, price) 
    @isbn = isbn 
    @price = Float(price) 
    ​end​ 

「這是我們第一次在本章中使用符號。正如我們所討論的,符號只是引用名稱的一種便捷方式。在這段代碼中,你可以想到:isbn的意思是名字isbn,並且認爲plain isbn意思是變量的值。在這個例子中,我們命名訪問器方法isbn和price。相應的實例變量是@isbn和@price。 「局部變量,實例變量和符號之間的混淆

問題:我知道局部變量被分配了實例變量,所以當initialize方法返回時它們不會消失。但爲什麼我必須使用attr_accessor符號?如果我只想要普通變量呢?我注意到,刪除冒號:isbn和:attr_accessor中的price會導致它停止工作。

回答

0

符號不是真正的變量;他們更像特殊的字符串。舉例來說,如果你使用的字符串,而不是你的代碼會工作得很好:

class​ BookInStock 
    attr_reader 'isbn', 'price' 

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

它更公約比真的功能的問題。例如,習慣用Ruby符號通常用於命名選項。

要獲得關於符號和字符串之間差異的詳細解釋,請查看以下博客文章:The Difference Between Ruby Symbols and Strings

0

我重寫代碼如下:

class BookInStock 
    attr_name1 = "isbn" 
    attr_name2 = :price 
    attr_reader attr_name1, attr_name2 
    def initialize(isbn, price) 
    @isbn = isbn 
    @price = Float(price) 
    end 
end 

b = BookInStock.new("23456", 30.3) 
puts b.isbn 
puts b.price 

Statament類definiton主體中執行的方式陳述出來的類定義體的相同。 「attr_reader attr_name1,attr_name2」不是一個貶義,它只是一個普通的語句,它用兩個參數attr_name1和attr_name調用attr_reader方法。 attr_reader是Module中定義的一種方法。