#methods and #public_instance_methods


#1

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


#2

String.instance_methods == “abc”.methods

String.instance_methods gives methods on instances of String.

String.methods gives methods on String itself.

Hth.

“Jeff C.” removed_email_address@domain.invalid wrote in message
news:removed_email_address@domain.invalid…


#3

Hi Jeff,

On Thu, Dec 15, 2005 at 02:24:10AM +0900, Jeff C. 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 :stuck_out_tongue: ).

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

#4

Got it.

Thanks everyone, that helps a lot.

Jeff