I'm trying to understand #methods and #public_instance_methods as I learn about introspection in Ruby. If I do String.methods in irb, I get a lot fewer listed than if I try String.public_instance_methods. I would have guessed that String.public_instance_methods would be a subset of String.methods. Also, ri String.public_instance_methods has no information, and public_instance_methods is not listed on ruby-doc.org/core. I only found it by doing a String.methods. Can anyone shed some light here? Thanks Jeff
on 2005-12-14 18:24
on 2005-12-14 19:25
String.instance_methods == "abc".methods String.instance_methods gives methods on instances of String. String.methods gives methods on String itself. Hth. "Jeff Cohen" <firstname.lastname@example.org> wrote in message news:email@example.com...
on 2005-12-14 19:43
Hi Jeff, On Thu, Dec 15, 2005 at 02:24:10AM +0900, Jeff Cohen wrote: > > Can anyone shed some light here? #methods returns the list of methods callable for that _object_. That is, if you call String.methods, you get the methods for the String object (the object of class Class, if you prefer :-P ). #public_instance_methods, on the other hand, is a method defined for Class objects (perhaps some other, but anyway). It returns the methods callable for the _objects of that class_. E.g.: if String.methods return ['a', 'b', 'c'] and String.public_instance_methods return ['d', 'e', 'f'], you can call String.a, String.b, String.c, "foo".d, "bar".e, "qux".f. You can also call String.public_instance_methods(false) if you only want the methods defined in the class String, but not inherited from String.superclass. HTH,
on 2005-12-14 19:52
Got it. Thanks everyone, that helps a lot. Jeff