局部变量,实例变量和符号之间的混淆

时间:2013-11-23 03:05:53

标签: ruby attr-accessor

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中的价格导致它停止工作。

2 个答案:

答案 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。中定义的方法。