Получить список методов экземпляра класса - PullRequest
92 голосов
/ 24 июня 2011

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

class TestClass
  def method1
  end

  def method2
  end

  def method3
  end
end

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

Ответы [ 6 ]

106 голосов
/ 24 июня 2011

Вы действительно хотите 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"]
103 голосов
/ 09 марта 2013
TestClass.methods(false) 

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

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

33 голосов
/ 24 июня 2011
TestClass.instance_methods

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

TestClass.instance_methods - Object.methods

(Был 'TestClass.methods - Object.methods')

6 голосов
/ 24 июня 2011

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

5 голосов
/ 08 сентября 2014
$ 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
2 голосов
/ 06 июня 2017

Согласно Ruby Doc instance_methods

Возвращает массив, содержащий имена открытых и защищенных методы экземпляра в приемнике. Для модуля это публичные и защищенные методы; для класса они являются экземпляром (не синглтон) методы. Если необязательный параметр имеет значение 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]
...