web-dev-qa-db-fra.com

Obtenir la liste des méthodes d'instance d'une classe

J'ai un cours:

class TestClass
  def method1
  end

  def method2
  end

  def method3
  end
end

Comment puis-je obtenir une liste de mes méthodes dans cette classe (method1, method2, method3)?

92
Vladimir Tsukanov

Vous voulez réellement TestClass.instance_methods _, sauf si vous êtes intéressé par ce que TestClass lui-même peut faire.

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

Ou vous pouvez appeler methods (pas instance_methods) sur l'objet:

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

pour obtenir uniquement les méthodes qui appartiennent à cette classe uniquement.

TestClass.instance_methods(false) renverrait les méthodes de votre exemple donné (puisqu'il s'agit de méthodes d'instance de TestClass).

106
Bijan
TestClass.instance_methods

ou sans toutes les méthodes héritées

TestClass.instance_methods - Object.methods

(Était 'TestClass.methods - Object.methods')

35
Pavling

Vous pouvez obtenir une liste plus détaillée (structurée par exemple en définissant une classe) avec des gemmes telles que débogage ou looksee .

6
J-_-L
$ 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
5
Douglas G. Allen

Selon Ruby Doc instance_methods

Renvoie un tableau contenant les noms des méthodes d'instance publique et protégée dans le récepteur. Pour un module, ce sont les méthodes publiques et protégées; pour une classe, ce sont les méthodes d'instance (pas de singleton). Si le paramètre facultatif est false, les méthodes de tous les ancêtres ne sont pas incluses. Je prends l'exemple de la documentation officielle.

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

Voyons la sortie.

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