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
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]]
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 ).