[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Keep track of all instances of a class without losing GC?

Jez Stephens

8/27/2006 2:46:00 PM

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

--
Posted via http://www.ruby-....

4 Answers

Ken Bloom

8/27/2006 2:58:00 PM

0

On Sun, 27 Aug 2006 23:45:34 +0900, Jez Stephens wrote:

> 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
>

Have a look at weakref.rb. Either use that directly, or copy ideas from
weakref.rb to create your own system.

--Ken Bloom

--
Ken Bloom. PhD candidate. Linguistic Cognition Laboratory.
Department of Computer Science. Illinois Institute of Technology.
http://www.iit.edu...

Ara.T.Howard

8/27/2006 3:04:00 PM

0

Tomasz Wegrzanowski

8/27/2006 3:05:00 PM

0

On 8/27/06, Jez Stephens <jezstephens@gmail.com> 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
>
> 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.

--
Tomasz Wegrzanowski [ http://t-a-w.blo... ]

Julian 'Julik' Tarkhanov

8/27/2006 3:58:00 PM

0


On 27-aug-2006, at 16:45, Jez Stephens 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 ? :-)

--
Julian 'Julik' Tarkhanov
please send all personal mail to
me at julik.nl