2011-09-26 6 views
9

में एक वस्तु की classname हो रही है मैं एक वस्तु संदर्भ है और यह प्रकार का ऑब्जेक्ट के लिए एक संदर्भ हो सकता है 'FooInvalidResults'पर्ल

एक फ़ाइल FooInvalidResults.pm कहा जाता है और एक लाइन 'पैकेज FooInvalidResults' है इस में।

निम्नलिखित काम करेगा?

my $class = blessed $result; 
if ($class eq 'FooInvalidResults') { 
    # do something 
} else { 
    # do something else 
} 

उत्तर

1

आपने UNIVERSAL::isa का उपयोग क्यों नहीं किया?

if UNIVERSAL::isa($result, "FooInvalidResults") { 
    ... 
} 

यह बुरी सलाह था, का इस्तेमाल करें

$obj->isa('FooInvalidResults'); 

मैं पूरी सबरूटीन कॉल (बुरा) और विधि कॉल (अच्छा) के बीच अंतर के बारे में पता नहीं था, लेकिन इसके बाद स्पष्ट हो गया मैंने कुछ आरटीएफएम स्वयं किया (perldoc UNIVERSAL)। मेरी गलती की ओर इशारा करते हुए सभी लोगों को धन्यवाद (और +1)।

+1

कृपया किसी को यूनिवर्सल :: आईएसए का उपयोग करने की सलाह न दें! अगर कोई जानता है, जब इसका उपयोग करना खतरनाक है, तो वह नहीं पूछेगा ... –

+1

@ जेनहार्टंग रोजर। मुझे पता नहीं था कि 'यूनिवर्सल :: आईएसए' इस तरह का टाइमबॉम्ब था। हो सकता है कि मैंने परेशानी में आने के लिए पर्याप्त 'आईएसए' का दुरुपयोग नहीं किया है। –

+0

$ obj-> आईएसए काम नहीं करता है जब मैं किसी ऑब्जेक्ट की गारंटी देना चाहता हूं सुपरक्लास का सदस्य है और कुछ उप-वर्ग का सदस्य नहीं है। –

15

स्ट्रिंग-तुलना वर्ग नाम आम तौर पर एक बुरा विचार है, क्योंकि यह उपप्रकारों के आधार पर बहुरूपता को तोड़ता है, और क्योंकि यह आम तौर पर अच्छा ओओ अभ्यास नहीं है, यह किसी ऑब्जेक्ट के अंतरंग विवरण जैसे सटीक पैकेज नाम के बारे में नुकीला है।

इसके बजाय, $result->isa('FooInvalidResults') लिखें - या, यदि आप इस संभावना के बारे में भद्दा हैं कि $result कोई ऑब्जेक्ट नहीं है, blessed $result && $result->isa('FooInvalidResults')

UNIVERSAL::isa का उपयोग करते हुए एक बुरा विचार है क्योंकि कुछ वस्तुओं (उदाहरण के लिए, परीक्षण के लिए कृत्रिम वस्तुओं) वैध कारण isa विधि ओवरराइड करने के लिए है, और UNIVERSAL::isa टूट जाता है कि फोन करने के लिए है।

+0

आपकी राय में, 'यूनिवर्सल :: आईएसए' हमेशा एक बुरा विचार है, या यह साधारण मामलों के लिए एक व्यवहार्य समाधान हो सकता है? –

+0

@ मार्कोडेलेलिस यदि ऐसे मामले हैं जहां इसका उपयोग करना समझ में आता है, तो यह निश्चित रूप से * सरल * नहीं है। एक कस्टम एमआरओ या कुछ लिखते समय यह समझ में आता है, लेकिन इसे सामान्य उद्देश्यों के लिए कभी भी इस्तेमाल नहीं किया जाना चाहिए। – hobbs

0

यह भी संभव है ref()Scalar::Util::blessed() बजाय builtin के साथ काम करने के लिए:

$ perl -E '$ref = {}; say ref $ref' 
HASH 
:

$ perl -E '$ref = {}; bless $ref => "Foo"; say ref $ref' 
Foo 

ध्यान दें कि यदि संदर्भ धन्य नहीं है, इस संदर्भ के प्रकार वापस आ जाएगी

हालांकि, जैसा कि अन्य ने उल्लेख किया है, UNIVERSAL::isa एक बेहतर समाधान है।

+1

कृपया किसी को भी यूनिवर्सल :: आईएसए का उपयोग करने की सलाह न दें! अगर कोई जानता है, जब इसका उपयोग करना खतरनाक है, तो वह नहीं पूछेगा ... –