2013-11-23 112 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中定义的一种方法。