Sınıfım var:
class TestClass
def method1
end
def method2
end
def method3
end
end
Nasıl (bu sınıfta benim yöntemlerinin bir listesini alabilirsiniz method1
, method2
, method3
)?
Sınıfım var:
class TestClass
def method1
end
def method2
end
def method3
end
end
Nasıl (bu sınıfta benim yöntemlerinin bir listesini alabilirsiniz method1
, method2
, method3
)?
Yanıtlar:
Kendisinin neler yapabileceğiyle TestClass.instance_methods
ilgilenmedikçe, gerçekten istiyorsun 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"]
Veya nesneyi çağırabilir methods
( çağıramazsınız instance_methods
):
test_object = TestClass.new
test_object.methods.grep(/method1/) # => ["method1"]
print TestClass.new.instance_methods
bu hatayı alıyorummy_class.rb:10:in <main>: undefined method instance_methods for #<TestClass:0x96b9d20> (NoMethodError)
TestClass.new.methods
. Belki cevabımda "o" belirsizdi.
[:method1]
yerine alırsınız .
TestClass.methods(false)
yalnızca o sınıfa ait olan yöntemleri almak için.
TestClass.instance_methods(false)
Verdiğiniz örnekteki yöntemleri döndürür (çünkü bunlar TestClass'ın örnek yöntemleri).
Object#methods
yöntemleri döndürür . Bir nesnede çağırabileceğiniz yöntemler nelerdir? Sınıfında tanımlananlar . Hangi vasıta yapabilirsiniz yöntemleri listesini döndürür çağrı üzerine kendi sınıfında tanımlanan yöntemlerdir. Nedir bireyin sınıf? Öyle . Yani, size tanımlanan yöntemler verir , değil tanımlanır olanlar . Bu cevabın 116 olumlu oyu nasıl aldığından emin değilim, ne zaman bile olsaTestClass.methods
TestClass
TestClass
Class
TestClass.methods
Class
TestClass
TestClass.instance_methods
veya miras alınan tüm yöntemler olmadan
TestClass.instance_methods - Object.methods
('TestClass.methods - Object.methods' idi)
TestClass.methods(false)
.
TestClass.methods(false)
boş dönüyor
method1
, method2
veya method3
bu yöntemleri olarak, örneklerde sınıfı, bir metotlarla TestClass
kendisi nesne.
$ 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
Hata ayıklama veya looksee gibi değerli taşlarla daha ayrıntılı bir liste (örneğin, sınıf tanımlayarak yapılandırılmış) elde edebilirsiniz .
Ruby Doc instance_methods'a göre
Alıcıdaki genel ve korumalı örnek yöntemlerinin adlarını içeren bir dizi döndürür. Bir modül için bunlar halka açık ve korumalı yöntemlerdir; bir sınıf için bunlar örnek (tekil değil) yöntemleridir. İsteğe bağlı parametre yanlışsa, herhangi bir atanın yöntemi dahil edilmez. Resmi dokümantasyon örneğini alıyorum.
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
Çıktıya bakalım.
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]
Yalnızca kendi yöntemlerini almak ve devralınanları hariç tutmak için:
Örnek içinden:
self.methods - self.class.superclass.instance_methods
Dışarıdan:
TestClass.instance_methods - TestClass.superclass.instance_methods
Sınıfa ekleyin:
class TestClass
class << self
def own_methods
self.instance_methods - self.superclass.instance_methods
end
end
end
TestClass.own_methods
=> [:method1, :method2, :method3]
(yakut 2.6.x ile)