From: MonkeeSage Date: 2007-11-29T11:40:05+09:00 Subject: Like python's dir(), except better... People often want to look at an object's attributes when debugging. [1] Python has a handy dir() function that lists the attributes of an object. And I use it tons. I often use obj.methods.sort in ruby for the same purpose. But that doesn't show me class variables. There are a handful of reflection functions to show different types of metadata about an object. So...this is my attempt to create a "Super dir() with extra-strength, industrial, ruby power". I probably failed, and it's probably buggy as I just hacked it together in about 15 minutes. In other words, I've not tested it very extensively, YMMV (in fact your hair may spontaneously catch on fire and you may start chanting backwards in Latin...don't blame me; I've warned you!). class DirObject def initialize(attrs=[]) @attributes = attrs end def push(metadata) @attributes << metadata end def include?(test) @attributes.each { | key, value | return true if value.include?(test) } false end def show puts @attributes.map { | key, value | #key + ":\n " + value.join("\n ") key + ":\n " + value.inspect }.join("\n\n") self end end class Object private def _get_metadata(meta) begin send(meta) rescue NameError [] end end def _format_meta(meta) unless (idx = meta.index("_")).nil? meta[0] = meta[0].chr.upcase meta[idx+1] = meta[idx+1].chr.upcase meta = meta[0..idx-1] + " " + meta[idx+1..-1] else meta[0] = meta[0].chr.upcase meta end end def _do_metadata(meta, dirobj) data = _get_metadata(meta) unless data.empty? meta = _format_meta(meta) dirobj.push([meta, data.sort]) end dirobj end public def dir(verbose=false) dirobj = DirObject.new _do_metadata("class_variables", dirobj) _do_metadata("instance_variables", dirobj) _do_metadata("methods", dirobj) _do_metadata("instance_methods", dirobj) if verbose _do_metadata("private_methods", dirobj) _do_metadata("private_instance_methods", dirobj) _do_metadata("protected_methods", dirobj) _do_metadata("protected_instance_methods", dirobj) _do_metadata("public_methods", dirobj) _do_metadata("public_instance_methods", dirobj) _do_metadata("singleton_methods", dirobj) end dirobj end def ls(verbose=false) dir(verbose).show end end Comments, corrections and criticisms welcome! Ps. Object#dir actually prints the metadata (like python's dir()), and #ls just gives you a DirObject which is really only useful to do an includes? on (which searches for a value through the entire metadata). http://monkeesage.prohosts.org/ruby/dir.rb [right-click save-as] Regards, Jordan [1] http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/d107b1318bbfdfd1/afa5a69d30007a64?lnk=gst&q=python+dir()#msg_77d85f05e1ae8e66