class Person
attr_accessor :name
class << self
attr_accessor :instances
def instances
@instances ||= []
@instances
end
end
def initialize( name )
Person.instances << self
@name = name
end
end
joe = Person.new( "Joe" )
zach = Person.new( "Zach" )
puts "You have #{Person.instances.size} people in existance!" POINT C
class Paramedic < Person
def initialize( name )
super( name )
Paramedic.instances << self
end
end
sally = Paramedic.new( "Sally" )
puts "You have #{Person.instances.size} people in existance!" #POINT B
puts "You have #{Paramedic.instances.size} paramedics in existance!" POINT C
这些线做了什么?
@instances ||= []
Person.instances << self
Paramedic.instances << self
答案 0 :(得分:2)
有班级变量@instances
。
第一行
@instances ||= []
如果@instances
为零,则使用空数组初始化此变量。
然后在初始化类的实例时,Person代码Person.instances << self
将此实例添加到Person类的所有实例的数组中。
因此,如果您致电Person.instances
,您将提供所有类别的实例。
与护理人员的情况相同。
答案 1 :(得分:0)
此代码基本上跟踪Person
和Paramedic
的实例。每次构造其中一个时,创建的对象将添加到类变量instances
表示的列表中。在这种情况下,self
指的是实例本身。
@instances ||= []
是一个Ruby惯用语,是@instances = @instances || []
的缩写。因为在Ruby中只有false
和nil
评估为false
,所以如果@instances
尚不存在,则代码段会返回@instances
或空列表。