Get list of a class' instance methods

RubyReflectionRuby 1.9.2

Ruby Problem Overview


I have a class:

class TestClass
  def method1
  end

  def method2
  end

  def method3
  end
end

How can I get a list of my methods in this class (method1, method2, method3)?

Ruby Solutions


Solution 1 - Ruby

You actually want TestClass.instance_methods, unless you're interested in what TestClass itself can do.

class TestClass
  def method1
  end

  def method2
  end

  def method3
  end
end

TestClass.methods.grep(/method1/) # => []
TestClass.instance_methods.grep(/method1/) # => ["method1"]
TestClass.methods.grep(/new/) # => ["new"]

Or you can call methods (not instance_methods) on the object:

test_object = TestClass.new
test_object.methods.grep(/method1/) # => ["method1"]

Solution 2 - Ruby

TestClass.methods(false) 

to get only methods that belong to that class only.

TestClass.instance_methods(false) would return the methods from your given example (since they are instance methods of TestClass).

Solution 3 - Ruby

TestClass.instance_methods

or without all the inherited methods

TestClass.instance_methods - Object.methods

(Was 'TestClass.methods - Object.methods')

Solution 4 - Ruby

$ irb --simple-prompt

class TestClass
  def method1
  end

  def method2
  end

  def method3
  end
end

tc_list = TestClass.instance_methods(false)
#[:method1, :method2, :method3]
puts tc_list
#method1
#method2
#method3

Solution 5 - Ruby

You can get a more detailed list (e.g. structured by defining class) with gems like debugging or looksee.

Solution 6 - Ruby

According to Ruby Doc instance_methods

> Returns an array containing the names of the public and protected > instance methods in the receiver. For a module, these are the public > and protected methods; for a class, they are the instance (not > singleton) methods. If the optional parameter is false, the methods of > any ancestors are not included. I am taking the official documentation example.

module A
  def method1()  
    puts "method1 say hi"
  end
end
class B
  include A #mixin
  def method2()  
     puts "method2 say hi"
  end
end
class C < B #inheritance
  def method3() 
     puts "method3 say hi"
  end
end

Let's see the output.

A.instance_methods(false)
  => [:method1]

A.instance_methods
  => [:method1]
B.instance_methods
 => [:method2, :method1, :nil?, :===, ...# ] # methods inherited from parent class, most important :method1 is also visible because we mix module A in class B

B.instance_methods(false)
  => [:method2]
C.instance_methods
  => [:method3, :method2, :method1, :nil?, :===, ...#] # same as above
C.instance_methods(false)
 => [:method3]

Solution 7 - Ruby

To get only own methods, and exclude inherited ones:

From within the instance:

self.methods - self.class.superclass.instance_methods

From outside:

TestClass.instance_methods - TestClass.superclass.instance_methods

Add it to the class:

class TestClass
  class << self
    def own_methods
      self.instance_methods - self.superclass.instance_methods
    end
  end
end

TestClass.own_methods
=> [:method1, :method2, :method3]

(with ruby 2.6.x)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionVladimir TsukanovView Question on Stackoverflow
Solution 1 - RubyAndrew GrimmView Answer on Stackoverflow
Solution 2 - RubyBijanView Answer on Stackoverflow
Solution 3 - RubyPavlingView Answer on Stackoverflow
Solution 4 - RubyDouglas G. AllenView Answer on Stackoverflow
Solution 5 - RubyJ-_-LView Answer on Stackoverflow
Solution 6 - RubyMukesh Kumar GuptaView Answer on Stackoverflow
Solution 7 - RubynakwaView Answer on Stackoverflow