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 de esta clase ( method1
, method2
, method3
)?
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 de esta clase ( method1
, method2
, method3
)?
Respuestas:
Realmente lo desea TestClass.instance_methods
, a menos que esté interesado en lo que TestClass
puede hacer por sí mismo.
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 llamar methods
(no instance_methods
) al objeto:
test_object = TestClass.new
test_object.methods.grep(/method1/) # => ["method1"]
print TestClass.new.instance_methods
, aparece este errormy_class.rb:10:in <main>: undefined method instance_methods for #<TestClass:0x96b9d20> (NoMethodError)
TestClass.new.methods
. Tal vez "eso" fue ambiguo en mi respuesta.
[:method1]
lugar obtendrías .
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).
TestClass.instance_methods
o sin todos los métodos heredados
TestClass.instance_methods - Object.methods
(Era 'TestClass.methods - Object.methods')
TestClass.methods(false)
.
TestClass.methods(false)
vuelve vacío
method1
, method2
o method3
, ya que son métodos de instancias de la clase, no métodos del TestClass
objeto en sí.
Puede obtener una lista más detallada (por ejemplo, estructurada mediante la definición de clase) con gemas como depuración 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
Según Ruby Doc instance_methods
Devuelve una matriz que contiene los nombres de los métodos de instancia pública y protegida 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 singleton). Si el parámetro opcional es falso, no se incluyen los métodos de ningún antepasado. Estoy tomando el ejemplo de la 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 el resultado.
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]
Para obtener solo métodos propios y excluir los heredados:
Desde dentro de la instancia:
self.methods - self.class.superclass.instance_methods
Desde afuera:
TestClass.instance_methods - TestClass.superclass.instance_methods
Agréguelo a la clase:
class TestClass
class << self
def own_methods
self.instance_methods - self.superclass.instance_methods
end
end
end
TestClass.own_methods
=> [:method1, :method2, method3]
(con rubí 2.6.x)