Feature #6241
closed
Module#method_defined? with inherited flag
Added by nobu (Nobuyoshi Nakada) over 12 years ago.
Updated about 12 years ago.
Description
=begin
Currently (({Module#method_defined?})) does not accept "(({inherited}))" flags as (({Module#instance_methods})) and others.
To tell if a method is defined at an exact class/module, we have to use bad idiom:
mod.instance_methods(false).include?(:foo)
So I propose to let (({method_defined?})) and etc accept the flag.
=end
Files
- Tracker changed from Bug to Feature
I think this is certainly a good idea. But I want to also point out that it's not always ideal either b/c #method_defined? reports false for private/protected methods. So in cases where the method in question might not have known visibility one would have to do:
if method_defined?(:foo) or private_method_defined?(:foo) or protected_method_defined?(:foo)
which sucks. Of course, this has always been an issue with #instance_methods too.
Perhaps now that named parameters are coming into their own, the interface should be modified to handle options?
method_defined?(:foo, all: true, inherited: false)
- Status changed from Assigned to Rejected
- Target version changed from 2.0.0 to 2.6
Tomas has a point. We cannot accept the original idea.
So I reject this proposal. Try again.
In general I am not a big fun of inherited flag, since most inheritance works rather as composition in Ruby.
Matz.
Also available in: Atom
PDF
Like0
Like0Like0Like0