How do I get the public methods of a class without inherited methods?
Solution 1
Just pass false
for the inherited
argument of public_methods
:
"hello".public_methods.include?(:dup) # => true
"hello".public_methods(false).include?(:dup) # => false
Not an answer to your question, but in case you didn't know, irb
does autocompletion, so it's easy to get the list of public methods (especially if you know the beginning of the method you are looking for). Just hit tab; hitting it twice will list all possibilities (including inherited ones, though):
> "nice".d<tab><tab>
"nice".delete "nice".delete! "nice".display "nice".downcase
"nice".downcase! "nice".dump "nice".dup "nice".define_singleton_method
> "nice".<tab><tab>
Display all 162 possibilities? (y or n)
...
Using pry
makes it even easier to see the methods available, broken down by level of inheritance:
[1] pry(main)> cd "nice"
[2] pry("nice"):1> ls
Comparable#methods: < <= > >= between?
String#methods: % * + << <=> == === =~ [] []= ascii_only? bytes bytesize byteslice capitalize capitalize! casecmp center chars chomp chomp! chop chop! chr clear codepoints concat count crypt delete delete! downcase downcase! dump each_byte each_char each_codepoint each_line empty? encode encode! encoding end_with? eql? force_encoding getbyte gsub gsub! hash hex include? index insert inspect intern length lines ljust lstrip lstrip! match next next! oct ord partition prepend replace reverse reverse! rindex rjust rpartition rstrip rstrip! scan setbyte shellescape shellsplit size slice slice! split squeeze squeeze! start_with? strip strip! sub sub! succ succ! sum swapcase swapcase! to_c to_f to_i to_r to_s to_str to_sym tr tr! tr_s tr_s! unpack upcase upcase! upto valid_encoding?
locals: _ _dir_ _ex_ _file_ _in_ _out_ _pry_
Solution 2
Take a look at Module#instance_methods. That method has one boolean argument include_super
whether to return the inherited methods as well. Default value is true.
You can use the following:
class A
def method_1
puts "method from A"
end
end
class B < A
def method_2
puts "method from B"
end
end
B.instance_methods # => [:method_1, :method_2, ...]
B.instance_methods(false) # => [:method_2]
Related videos on Youtube
Comments
-
Andrew almost 2 years
Given any object I can call
#public_methods
and see all the methods it will respond to. However, I find it would sometimes be handy to get a quick list of all the public methods that are not inherited, i.e. the stuff that's really part of this class.I found in "Easy way to list public methods for a Ruby object" that if I use:
(Foo.public_methods - Object.public_methods).sort
I can filter out a lot of basic Ruby stuff. I'd like to be able to filter everything that was inherited all the way up the chain. If I know the parent class I can filter using it, but I'd like to come up with a generic command that could return an array of the uninherited public methods for any object.
-
Sergio Tulentsev over 12 yearsdid you mean
irb
orirc
? :-) -
Marc-André Lafortune over 12 yearsIndeed,
irb
. Thanks to you and @Mu -
Andrew over 12 yearsAh, super helpful! I didn't realize
#public_methods
accepted any arguments, and it didn't even occur to me to check. Thanks! -
Jochem Schulenklopper over 5 yearsBTW, the comparable method on
Object
is calledpublic_methods
, see ruby-doc.org/core-2.5.1/Object.html#method-i-public_method. The methodinstance_methods
is on theModule
, see ruby-doc.org/core-2.5.1/Module.html#method-i-instance_methods.