2009-01-20 12 views
6

İki (gayri resmi) arabirimi uygulayan bir polimorfik nesne dizim var.Perl'de bir nesnenin bir yöntemi uygulayıp uygulamadığını nasıl belirlerim?

if (hasattr(obj, 'some_method')) { 
    # `some_method` is only implemented by one interface. 
    # Now I can use the appropriate dispatch semantics. 
} else { 
    # This must be the other interface. 
    # Use the alternative dispatch semantics. 
} 

Belki böyle bir şey çalışır ?:

if (*ref(obj)::'some_method') { 
    # ... 

ben zorluk sözdizimi alt yordam çağırmak denemek ve ne zaman söylüyorum vardır: Ben çizgisinde yansıması ile bunlar arasında ayrım yapmak mümkün istiyorum Bir altprogram referansı döndüğünde. Paket sembol tabloları ATM'ye fazla aşina değilim ve sadece bir şeyi kesmeye çalışıyorum. :-)

Şimdiden teşekkürler!

cevap

16
use Scalar::Util qw(blessed); 
if(blessed($obj) and $obj->can('some_method')){ 

} 

"can" Burada UNIVERSAL tüm sınıflar tarafından miras bir yöntemdir. Sınıflar bu yöntemi geçersiz kılabilir, ancak bunun iyi bir fikir değildir. Ayrıca

, "can" işlevine bir başvuru verir, böylece yapabilirsiniz:

$foo->can('some_method')->($foo , @args); 

veya

my $sub = $foo->can('some_method'); 
$foo->$sub(@args); 

Edit Güncelleme Zincir Sözdizimi, Brian Phillips'e teşekkürler

+0

Bazı yöntemlerle ayrılmış bir yöntem adı olabilir mi, yoksa bunu uygularsanız kendinizi ayağınıza mı çekiyorsunuz? – cdleary

+0

Nesneyi, tarafından döndürülen işlev referansına açıkça iletmeniz gerektiğini unutmayın: $ foo-> can ('some_method') -> ($ foo, @args). Alternatif olarak, $ sub = $ foo-> can ('some_method'); $ Foo -> $ alt (@args); –

+0

'Can'ı geçersiz kılmaya karşı genel bir tedbir biraz kuvvetlidir. Bunu yapmak için iyi ve önemli nedenler var. – darch

İlgili konular