答案部分正确,因为@@实际上是每个类层次结构的类变量,这意味着它由类,其实例,其后代类及其实例共享。
class Person
@@people = []
def initialize
@@people << self
end
def self.people
@@people
end
end
class Student < Person
end
class Graduate < Student
end
Person.new
Student.new
puts Graduate.people
这将输出
#<Person:0x007fa70fa24870>
#<Student:0x007fa70fa24848>
因此,Person,Student和Graduate类只有一个相同的@@ variable,并且这些类的所有类和实例方法都引用相同的变量。
还有另一种定义在类对象上定义的类变量的方法(请记住,每个类实际上是某个事物的实例,而该事物实际上是Class类,但这是另一回事了)。您使用@表示法而不是@@,但无法从实例方法访问这些变量。您需要具有类方法包装器。
class Person
def initialize
self.class.add_person self
end
def self.people
@people
end
def self.add_person instance
@people ||= []
@people << instance
end
end
class Student < Person
end
class Graduate < Student
end
Person.new
Person.new
Student.new
Student.new
Graduate.new
Graduate.new
puts Student.people.join(",")
puts Person.people.join(",")
puts Graduate.people.join(",")
在这里,@ people每个类都是单个类,而不是类层次结构,因为它实际上是存储在每个类实例上的变量。这是输出:
#<Student:0x007f8e9d2267e8>,#<Student:0x007f8e9d21ff38>
#<Person:0x007f8e9d226158>,#<Person:0x007f8e9d226608>
#<Graduate:0x007f8e9d21fec0>,#<Graduate:0x007f8e9d21fdf8>
一个重要的区别是,您不能直接从实例方法访问这些类变量(或您可以说的类实例变量),因为实例方法中的@people将引用Person或Student或Graduate类的特定实例的实例变量。 。
因此,尽管其他答案正确地指出@myvariable(带有单个@表示法)始终是一个实例变量,但这并不一定意味着它不是该类所有实例的单个共享变量。