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中的价格导致它停止工作。
答案 0 :(得分: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。
答案 1 :(得分: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
类definiton体中的statament执行方式与类定义体中的语句相同。 “attr_reader attr_name1,attr_name2”不是delaration,它只是一个普通的语句,它使用两个参数attr_name1和attr_name调用方法attr_reader。 attr_reader是Module。中定义的方法。