Forum: Ruby How do you know what class defines method foo()?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Ca0b18ec9e11dc777b2b8084fe5d5f90?d=identicon&s=25 Sam Kong (Guest)
on 2005-12-22 23:00
(Received via mailing list)
Hi, folks!

What's the easiest(simplest) code to find a class/module that first
defines a specific method?
I became curious while I was looking for a document of Array#partition
method.
Actually the method is defined in Enumerable module.
But I couldn't guess that it was defined there until I checked Array
class's doc first.
If the inheritance(or mixin) hierarchy is very complex, it will take
long to find a method.

The one I can think of is using MyClass.ancestors and
MyClass.instance_methods recursively (or repeatedly).
Is there a better way?
(On my second thought, singleton classes should also be considered,
right?)

The method prototype might be like...

#returns a class or module which defines the method
def defined_where(obj, method_name)
   ...
end

Thanks.

Sam
38a8230ed3d5c685558b4f0aad3fc74b?d=identicon&s=25 Joe Van Dyk (Guest)
on 2005-12-23 00:12
(Received via mailing list)
On 12/22/05, Sam Kong <sam.s.kong@gmail.com> wrote:
> Hi, folks!
>
> What's the easiest(simplest) code to find a class/module that first
> defines a specific method?

$ ri partition

--------------------------------------------------- Enumerable#partition
     enum.partition {| obj | block }  => [ true_array, false_array ]
------------------------------------------------------------------------
     Returns two arrays, the first containing the elements of _enum_ for
     which the block evaluates to true, the second containing the rest.

        (1..6).partition {|i| (i&1).zero?}   #=> [[2, 4, 6], [1, 3, 5]]
E34b5cae57e0dd170114dba444e37852?d=identicon&s=25 Logan Capaldo (Guest)
on 2005-12-23 00:15
(Received via mailing list)
On Dec 22, 2005, at 4:57 PM, Sam Kong wrote:

> long to find a method.
> def defined_where(obj, method_name)
>    ...
> end
>
> Thanks.
>
> Sam
>
>



Array.method_defined?(:partition)
#=> true

Enumerable.method_defined?(:partition)
#=> true

Same for instance_methods.include?.
If we loop forward through ancestors, we get Array as the answer. If
we loop backwards we get Enumerable. The problem is, looping
backwards will get us the wrong answer if Array overrides partition.
I can't think of a good why to do this unless there is a
Class#overrides? method. (e.g. Array.overrides?(:partition) #=> false ).
18ca239ffade6df0b839d26062f173fb?d=identicon&s=25 Dominik Bathon (Guest)
on 2005-12-23 05:01
(Received via mailing list)
On Fri, 23 Dec 2005 00:12:51 +0100, Logan Capaldo
<logancapaldo@gmail.com>
wrote:

> good why to do this unless there is a Class#overrides? method. (e.g.
> Array.overrides?(:partition) #=> false ).

I just played a bit around and found Method#inspect:

>> a = []
=> []
>> a.method(:partition)
=> #<Method: Array(Enumerable)#partition>
>> a.method(:first)
=> #<Method: Array#first>
>> a.method(:send)
=> #<Method: Array(Kernel)#send>
>> class Array; def send *a; super end end
=> nil
>> a.method(:send)
=> #<Method: Array#send>

So, if just want to know it for one case, use irb and look at
Method#inspect.

To write a method that returns the class/module that defines a method
one
might parse the output of Method#inspect, but I think that is not very
nice.

There doesn't seem to be a direct way to get the class/module in Ruby.


Dominik
Ca0b18ec9e11dc777b2b8084fe5d5f90?d=identicon&s=25 Sam Kong (Guest)
on 2005-12-23 07:11
(Received via mailing list)
> So, if just want to know it for one case, use irb and look at
> Method#inspect.
>
> To write a method that returns the class/module that defines a method one
> might parse the output of Method#inspect, but I think that is not very
> nice.

This is exactly what I wanted.
I didn't know that there's 'method' method.
Thank you very much.

Sam
E0ed615bd6632dd23165e045e3c1df09?d=identicon&s=25 =?ISO-8859-15?Q?Florian_Gro=DF?= (Guest)
on 2005-12-23 21:18
(Received via mailing list)
Dominik Bathon wrote:

> To write a method that returns the class/module that defines a method
> one  might parse the output of Method#inspect, but I think that is not
> very  nice.
>
> There doesn't seem to be a direct way to get the class/module in Ruby.

But there ought to be. If you think so as well please vote on this RCR:

http://www.rcrchive.net/rcr/show/292
This topic is locked and can not be replied to.