[英]How to access a class variable from the outside in ruby?
我正在尝试从类外部的方法访问类变量。
这是我的班级:
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?
使用class_variable_get
访问类外的类变量:
class Foo
@@a = 1
end
Foo.class_variable_get(:@@a)
=> 1
对于大多数情况,类实例变量优先于类变量。 当与继承一起使用时,后者容易出现各种奇怪的行为。
考虑:
class Book
@book_count = 0
@all_books = []
class << self
attr_reader :book_count
attr_reader :all_books
end
# further code omitted.
end
使用此代码Book.book_count和Book.all_books获取预期数据。
您可以使用class_eval
到具体的类别范围内评估的代码块:
class Book
@@bookCount = 1
end
Book.class_eval '@@bookCount'
# => 1
而且只是为了好玩......你可以用class_eval
实际上做各种各样的class_eval
例如在类中定义一个没有猴子修补的新方法:
Book.class_eval { @@bookCount = 5 }
Book.class_eval '@@bookCount'
# => 5
Book.class_eval do
def self.hey_look_a_new_method
return "wow"
end
end
Book.hey_look_a_new_method
# => "wow"
您必须指定变量的类:
def seeBookShelf
if Book.bookCount == 0
puts "Your bookshelf is empty."
else
puts "You have " + Book.bookCount + " books in your bookshelf:"
puts Book.allBooks
end
end
你需要一个getter来访问类变量,试试这个代码。 有关说明,请参阅http://www.railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/ 。 你也最好使用字符串插值,否则你会得到一个Type错误,也就是更多的Rubyesque。
class Book
@@bookCount = 0
def self.bookCount
@@bookCount
end
end
def seeBookShelf
if Book.bookCount == 0
puts "Your bookshelf is empty."
else
puts "You have #{Book.bookCount} books in your bookshelf:"
end
end
seeBookShelf # Your bookshelf is empty.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.