【发布时间】:2017-04-22 23:04:26
【问题描述】:
我正在尝试从类外的方法访问类变量。
这是我的课:
class Book
@@bookCount = 0
@@allBooks = []
def self.allBooks
@@allBooks
end
def self.bookCount
@@bookCount
end
attr_accessor :name,:author,:date,:genre,:rating
def initialize(name, author, date, genre, rating)
@name = name
@author = author
@date = date
@genre = genre
@rating = rating
@@bookCount += 1
@@allBooks << self
end
end
这是试图访问类变量@@bookCount的方法
def seeBookShelf
if @@bookCount == 0
puts "Your bookshelf is empty."
else
puts "You have " + @bookCount + " books in your bookshelf:"
puts allBooks
end
end
当我尝试执行该方法时,我得到了这个:
undefined local variable or method `bookCount' for main:Object (NameError)
如何从外部访问 bookCount?
【问题讨论】:
-
第一个问题:为什么要使用类变量?这些在类和实例之间共享信息的方式通常会导致关注点的混淆。
self.class.allBooks比直接访问要好。 -
Ruby 约定还强烈建议您以
see_book_shelf的风格命名事物,变量或方法名称中不要大写。类有混合大小写,领先的资本,就像你在这里。 -
由于它保留了创建的任何 Book 实例的引用的方式,这基本上是在询问内存问题。您最好创建一个专门用于存储书籍的 BookShelf 类,而不是将此责任委托给 Book 的类级别。
-
也许在 Book 类中定义
VARIABLE = @@book_count,然后在类外使用Book::VARIABLE。但不确定这是否是推荐的技术,所以要小心。 -
@sagarpandya82 共享常量也是一件麻烦事。最好通过方法调用有一层薄薄的中介,这样您就可以有一些隔离,并且方法的实现可以在不破坏大量内容的情况下进行更改。
标签: ruby class-variables