From: RichardOnRails Date: 2008-09-14T10:13:01+09:00 Subject: Re: Finding parent-class hierarchy recursively On Sep 13, 5:21 am, Sebastian Hungerecker wrote: > RichardOnRails wrote: > > def parents(obj) > >   ( (obj.superclass ? parents(obj.superclass) : []) << obj). reverse > > end > > [...] > > parents(Class).inspect  =>  [Class, Object, Module] > >                    Expected:  [Class, Module, Object] > > Ok, here's what happens: > parents(Class)  = (parents(Module) << Class).reverse > parents(Module) = (parents(Object) << Module).reverse > parents(Object) = [Object] > parents(Module) = ([Object] << Module).reverse >                 = [Module, Object] > parents(Class)  = ([Module, Object] << Class).reverse >                 = [Module, Object, Class].reverse >                 = [Class, Object, Module] > > Anyway, do you know that you can get what you want just by calling > TheClass.ancestors? Well, not quite as that also includes included > modules, but TheClass.ancestors.grep(Class) would give you exactly > the results you expected from your method. > > HTH, > Sebastian > -- > NP: Obituary - I'm in Pain > Jabber: sep...@jabber.org > ICQ: 205544826 Thanks, Sebastian! I stupidly failed to recognize that "reverse" would affect each iteration of the recursive routine, rather than merely to last iteration as I intended. I removed the interior "reverse" and the world is beautiful again, to wit: parents(Class).reverse.inspect => [Class, Module, Object] > TheClass.ancestors? I did know about that, but thanks for asking. I wanted to write my own trace routine so that I have my own insight into metaprogramming techniques and the structure of Ruby. Best wishes, Richard