0
class​ BookInStock
  attr_reader :isbn, :price
  ​def​ initialize(isbn, price) 
    @isbn  = isbn
    @price = Float(price)
  ​end​

“这是我们在本章中第一次使用符号。正如我们所讨论的,符号只是引用名称的一种方便方式。在这段代码中,您可以将​:isbn​视为​名称​isbn​,​并将​普通​isbn​视为​变量​的​值​。在此示例中,我们将访问器方法命名为​isbn​和​price​。对应的实例变量是​@isbn​和​@price​。”</p>

问题:我知道局部变量被分配了实例变量,所以当initialize方法返回时它们不会消失。但是为什么我必须在 attr_accessor 中使用符号呢?如果我只想要普通变量怎么办?我注意到在 attr_accessor 中删除 :isbn 和 :price 的冒号会导致它停止工作。

4

2 回答 2

0

符号并不是真正的变量。它们更像是特殊的字符串。例如,如果您使用字符串代替,您的代码会正常工作:

class​ BookInStock
  attr_reader 'isbn', 'price'

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

实际上,这更多的是惯例问题而不是功能问题。例如,惯用的 Ruby 符号通常用于命名选项。

要获得有关符号和字符串之间差异的广泛解释,请查看此博客文章:Ruby 符号和字符串之间的区别

于 2013-11-23T03:15:10.833 回答
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

类定义体中的语句的执行方式与类定义体中的语句相同。"attr_reader attr_name1, attr_name2" 不是声明,它只是一个普通的语句,它使用两个参数 attr_name1 和 attr_name 调用方法 attr_reader。attr_reader 是 Module 中定义的方法。

于 2013-11-23T14:18:01.293 回答