Ho una lezione:
class TestClass
def method1
end
def method2
end
def method3
end
end
Come posso ottenere una lista dei miei metodi di questa classe ( method1
, method2
, method3
)?
Ho una lezione:
class TestClass
def method1
end
def method2
end
def method3
end
end
Come posso ottenere una lista dei miei metodi di questa classe ( method1
, method2
, method3
)?
Risposte:
Lo vuoi davvero TestClass.instance_methods
, a meno che tu non sia interessato a ciò che TestClass
può fare di per sé.
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"]
Oppure puoi chiamare methods
(non instance_methods
) sull'oggetto:
test_object = TestClass.new
test_object.methods.grep(/method1/) # => ["method1"]
print TestClass.new.instance_methods
, ottengo questo erroremy_class.rb:10:in <main>: undefined method instance_methods for #<TestClass:0x96b9d20> (NoMethodError)
TestClass.new.methods
. Forse "esso" era ambiguo nella mia risposta.
[:method1]
invece avresti .
TestClass.methods(false)
per ottenere solo metodi che appartengono solo a quella classe.
TestClass.instance_methods(false)
restituirebbe i metodi dal tuo esempio dato (poiché sono metodi di istanza di TestClass).
TestClass.instance_methods
o senza tutti i metodi ereditati
TestClass.instance_methods - Object.methods
(Era "TestClass.methods - Object.methods")
TestClass.methods(false)
.
TestClass.methods(false)
ritorna vuoto
method1
, method2
o method3
, poiché questi sono metodi di istanze della classe, non metodi TestClass
dell'oggetto stesso.
$ 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
Secondo Ruby Doc instance_methods
Restituisce un array contenente i nomi dei metodi di istanza pubblici e protetti nel ricevitore. Per un modulo, questi sono i metodi pubblici e protetti; per una classe, sono i metodi di istanza (non singleton). Se il parametro facoltativo è false, i metodi di eventuali antenati non vengono inclusi. Sto prendendo l'esempio della documentazione ufficiale.
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
Vediamo l'output.
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]
Per ottenere solo metodi propri ed escludere quelli ereditati:
Dall'interno dell'istanza:
self.methods - self.class.superclass.instance_methods
Da fuori:
TestClass.instance_methods - TestClass.superclass.instance_methods
Aggiungilo alla classe:
class TestClass
class << self
def own_methods
self.instance_methods - self.superclass.instance_methods
end
end
end
TestClass.own_methods
=> [:method1, :method2, method3]
(con rubino 2.6.x)