我想要类似下面的东西,但希望它可以重用于不同的类。如何创建一个存储实例的类?
我该如何重构这段代码,只需要很少的努力就可以将它包含在一个类中,并且每当有新的被调用时,这个类将自动收集实例?
我已经尝试了各种各样的重写新的或初始化的东西,但不能得到发生的魔法。
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请求,否则将继续存在?
我从那开始,但我读到,你可能会得到尚未GC'd的旧对象。任何人都可以确认吗? – Tim
是的,那是可能的。你想做什么?你为什么想要访问这些实例?如果你解释**你想要做什么,然后可能会有更好的**如何**,那就简单多了。 –
这是否意味着如果我使用带有Passenger的Rails,新连接将共享实例或者是等同于启动另一个进程的新连接? – Tim