我想要类似以下的东西,但希望它可用于不同的类。
如何重构此代码,以便以最小的努力将其包含在一个类中,并且该类将在调用 new 时自动收集实例?
我已经尝试了各种各样的事情,比如覆盖新的或初始化的,但就是无法让魔法发生。
class Person
@@people_instances = []
def initialize
@@people_instances << self
end
def self.instances
@@people_instances
end
end
People.new
People.new
Poople.instances
=> [#<Person:0x000001071a7e28>, #<Person:0x000001071a3828>]
在下面的一些反馈之后,我认为答案不是将实例放在类变量中,因为它将永远留在内存中。Rails 缓存也不太合适,因为我不需要实例持久化。
以下代码使用类实例变量而不是类变量。
http://www.dzone.com/snippets/class-variables-vs-class
class Employee
class << self; attr_accessor :instances; end
def store
self.class.instances ||= []
self.class.instances << self
end
def initialize name
@name = name
end
end
class Overhead < Employee; end
class Programmer < Employee; end
Overhead.new('Martin').store
Overhead.new('Roy').store
Programmer.new('Erik').store
puts Overhead.instances.size # => 2
puts Programmer.instances.size # => 1
这些实例变量对于每个 Rails 请求是唯一的还是会持续存在?