2009-12-31 8 views
8

Module.method_defined?(:method) kullanarak bir modülde bir yöntemin tanımlanıp tanımlanmadığını kontrol etmeye çalışıyorum ve yanlış geri dönüyorsa bu değer doğru olarak yapılmalıdır.Neden Module.method_defined? (: Method) düzgün çalışmıyor?

module Something 
    def self.another 
    1 
    end 
end 

Something.methods 'Başka' listelenen ama Something.method_defined?(:another) döner false sahiptir. yöntem öz üzerinde tanımlanmış olması nedeniyle çalışmıyor

bu belki mi? Bu durumda, yöntem method_defined? kullanma dışında bir modülde tanımlanmış olup olmadığını denetlemenin başka bir yolu var mı?

cevap

10

modülü modül yöntemi olup olmadığını bilmek için, respond_to kullanabilir? modülünde :

Something.respond_to?(another) 
=> true 

method_defined? Sunulan modül ile sınıfın INSTANCES'in verilen yönteme yanıt verip vermediğini size söyleyecektir.

+2

Belki bu yanlış okuyorum, ama olmamalı 'Something.respond_to? (: Başka)' yüzden 'another' bir semboldür. Aksi takdirde 'başka' bir tanımlanmamış hataya sebep olmaz mı? –

5

modüller yöntemler de metaclass tanımlanmıştır. Yani ayrıca yöntemi eklenmesi için kontrol edebilirsiniz:

k = class << Something; self; end # Retrieves the metaclass 
k.method_defined?(:another) #=> true 

Sen Understanding Ruby Metaclasses bu konuda daha fazla bilgi bulabilirsiniz.

+0

Bu sitedeki şema en az söylemek için kafa karıştırıcı. Sınıftaki yöntemleri 'devralma' örneği ne anlama geliyor? Bana yanlış terminoloji gibi görünüyor. Ayrıca metaclass'a işaret eden "instance_eval" etiketli okla ne anlama geliyor? 'instance_eval' değerlendirmesi, meta sınıfta gerçekleşmez, örnekte olur - tek istisna, 'instance' in bir 'instance_eval' içinde davranışıdır, bunun yerine metaclass üzerindeki yöntemleri tanımlar. – horseyguy

+0

Teşekkürler! Diğer cevapların neden onay işaretine gittiğinden emin değilsiniz. Bunu yapmanın yolu budur. –