una que programacion polimorfismo objetos metodos metodo manejo herencia ejemplos clases clase atributos ruby reflection ruby-1.9.2

ruby - polimorfismo - que es un metodo en programacion



Obtener una lista de los métodos de instancia de una clase (6)

Tengo una clase:

class TestClass def method1 end def method2 end def method3 end end

¿Cómo puedo obtener una lista de mis métodos en esta clase ( method1 , method2 , method3 )?


De acuerdo con Ruby Doc instance_methods

Devuelve una matriz que contiene los nombres de los métodos de instancia públicos y protegidos en el receptor. Para un módulo, estos son los métodos públicos y protegidos; para una clase, son los métodos de instancia (no solo). Si el parámetro opcional es falso, los métodos de cualquier antepasado no están incluidos. Estoy tomando el ejemplo de documentación oficial.

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

Veamos la salida.

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]


En realidad, quiere TestClass.instance_methods , a menos que esté interesado en lo que TestClass puede hacer.

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

O puede invocar methods (no instance_methods ) en el objeto:

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


Puede obtener una lista más detallada (por ejemplo, estructurada mediante la definición de clase) con gemas como la debugging o 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


TestClass.instance_methods

o sin todos los métodos heredados

TestClass.instance_methods - Object.methods

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


TestClass.methods(false)

para obtener solo métodos que pertenecen solo a esa clase.

TestClass.instance_methods(false) devolvería los métodos de su ejemplo dado (ya que son métodos de instancia de TestClass).