Получить список методов экземпляра класса

у меня есть класс:

class TestClass
  def method1
  end

  def method2
  end

  def method3
  end
end

как я могу получить список методов этого класса (method1, method2, method3)?

6 ответов


вы действительно хотите TestClass.instance_methods, Если вы не заинтересованы в том, что TestClass сама могу сделать.

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"]

или вы можете позвонить methods (не instance_methods) на объекте:

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

TestClass.methods(false) 

чтобы получить только методы, принадлежащие только этому классу.

TestClass.instance_methods(false) возвращает методы из вашего примера (поскольку они являются методами экземпляра TestClass).


TestClass.instance_methods

или без всех унаследованных методов

TestClass.instance_methods - Object.methods

(Был 'TestClass.методы - объект.методы')


вы можете получить более подробный список (например, структурированный путем определения класса) с драгоценными камнями, такими как отладка или looksee.


$ 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

согласно Ruby Doc instance_methods

возвращает массив, содержащий имена public и protected методы экземпляра в приемнике. Для модуля это public и защищенные методы; для класса, они являются экземпляр (не singleton) методы. Если необязательный параметр равен false, методы никакие предки не включены. Я беру пример официальной документации.

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

давайте посмотрим выход.

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]