jez
1
Hi,
I want to be able to keep track of all instances of a class using
something simple like this:
Class Thing
@@allthings = []
def initialize
@@allthings.push self
end
end
However an obvious drawback to this approach is that instances of this
class will never be garbage collected due to the reference held in
@@allthings.
Is there a way to make it so this reference in @@allthings “doesn’t
count”, so to speak?
Or is there a better way of doing it?
Thanks for your help
jez
2
On Sun, 27 Aug 2006, Jez S. wrote:
end
Thanks for your help
require ‘weakref’
check out the docs.
-a
jez
3
On Sun, 27 Aug 2006 23:45:34 +0900, Jez S. wrote:
end
Thanks for your help
Have a look at weakref.rb. Either use that directly, or copy ideas from
weakref.rb to create your own system.
–Ken B.
jez
4
On 8/27/06, Jez S. [email protected] wrote:
However an obvious drawback to this approach is that instances of this
class will never be garbage collected due to the reference held in
@@allthings.
Is there a way to make it so this reference in @@allthings “doesn’t
count”, so to speak?
Or is there a better way of doing it?
ObjectSpace already does it for you:
ObjectSpace.each_object(Thing) {|x| print x}
You could also use weak references, but Object Space is
much easier most of the time.
jez
5
On 27-aug-2006, at 16:45, Jez S. wrote:
I want to be able to keep track of all instances of a class using
something simple like this:
Class Thing
@@allthings = []
def initialize
@@allthings.push self
end
end
weakref might be of help indeed, you also can use lookups (3 extra
lines):
class Thing
@@things = []
def self.things
@@things.map{ | id | ObjectSpace._id2ref(id) }
end
def initialize
@@things << self.object_id
end
end
After that you might get lost references when object get garbage
collected, but if you don’t need that - what’s the point ? 