मुझे ऑब्जेक्ट्स का एक पॉलिमॉर्फिक सरणी मिली है जो दो (अनौपचारिक) इंटरफेस को लागू करती है।मैं कैसे निर्धारित करूं कि कोई ऑब्जेक्ट पर्ल में एक विधि लागू करता है या नहीं?
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.
}
हो सकता है कि कुछ इस तरह काम करता है ?:
if (*ref(obj)::'some_method') {
# ...
मैं कठिनाई बता जब वाक्य रचना और एक सबरूटीन आह्वान करने की कोशिश करेंगे है: मैं उन्हें की तर्ज पर प्रतिबिंब के साथ अंतर करने के लिए सक्षम होना चाहते हैं जब यह एक subroutine संदर्भ वापस करेगा। मैं पैकेज प्रतीक टेबल एटीएम से बहुत परिचित नहीं हूं और मैं बस कुछ हैक करने की कोशिश कर रहा हूं। :-)
अग्रिम धन्यवाद!
किसी भी तरीके से आरक्षित विधि नाम 'कर सकता है, या अगर आप इसे लागू करते हैं तो आप पैर में खुद को शूट करने के लिए बस होते हैं? – cdleary
भूलें कि आपको ऑब्जेक्ट को स्पष्ट रूप से पास किए गए फ़ंक्शन संदर्भ में पास करने की आवश्यकता है: $ foo-> can ('some_method') -> ($ foo, @args)। वैकल्पिक रूप से, मेरा $ sub = $ foo-> कर सकता है ('some_method'); $ Foo -> $ उप (@args); –
'कैन' ओवरराइड करने के खिलाफ एक सामान्य आदेश थोड़ा मजबूत है। ऐसा करने के अच्छे और महत्वपूर्ण कारण हैं। – darch