2011-08-04 11 views
7

में इंटरसेप्ट nonexistent विधियों को कॉल करें मैं कुछ subclass में nonexistent विधियों को रोकने के लिए प्रयास करें। हां, मुझे ऑटोोलॉड, के बारे में पता है लेकिन (विधियों के लिए) यह पहले माता-पिता :: विधि को कॉल करने का प्रयास करता है, फिर यूनिवर्सल :: विधि और केवल तब :: ऑटोोलॉइड। लेकिन मुझे पहली बार कॉल (कुछ ऐसा) :: ऑटोोलॉड चाहिए। क्योंकि मैं जानना चाहता हूं कि उप-वर्ग किस प्रकार माता-पिता से कॉल करने का प्रयास करता है।पर्स

कृपया मुझे इसके बारे में कुछ सलाह दें।

+0

[क्रॉसपोस्ट] (http://perlmonks.org/index.pl?node_id=918465) – daxim

+2

यह अच्छी तरह से गठित प्रश्न नहीं है, आप जो भी करना चाहते हैं उसके "क्यों" गायब हैं। आपको एक समस्या है, आपने एक समाधान सोचा था, लेकिन वह समाधान आधे रास्ते से काम नहीं करता है और अब आप इसे अंत तक बल्लेबाजी करना चाहते हैं। यदि आप अपनी मूल समस्या पर वापस आते हैं और हमें अनुमान लगाने के बिना बताते हैं, तो यह सही उत्तर प्राप्त करना अधिक आसान बनाता है। –

+1

'सब irreal_function' की तरह एक स्टब घोषणा करें, और यह इसकी सामान्य जगह में ट्रिगर होगा। – tchrist

उत्तर

0

उप-वर्ग पैकेज में AUTOLOAD उप क्यों नहीं बनाते हैं जो 1) गायब विधि की रिपोर्ट करता है और फिर 2) माता-पिता को कॉल भेजता है। इसके लिए आपको पर काम करने के लिए उप-वर्ग में @ISA परिभाषित नहीं किया गया है।

कुछ की तरह:

package my_parent; 

sub foo { warn "in my_parent::foo" } 

package my_subclass; 

my $PARENT_CLASS = "my_parent"; # assume only one parent 

# Note: no @ISA defined here 

sub AUTOLOAD { 
    warn "non-existent method $AUTOLOAD called\n"; 
    my $self = shift; 
    (my $method = $AUTOLOAD) =~ s{.*::}{}; 
    my $super = $PARENT_CLASS . '::' . $method; 
    $self->$super(@_); 
} 

package main; 

my $x = bless {}, 'my_subclass'; 
$x->foo; 

वाक्य रचना: $self->$super(@_) जहां $super उस में डबल-कोलन है जो पैकेज में पर्ल बताता विधि की तलाश में, उदाहरण के लिए शुरू करने के लिए:

$self->my_parent::foo(...) 

के लिए दिखेगा पैकेज my_parent में foo विधि से शुरू होने वाली विधि $self किस वर्ग में अनुशंसित है।

+0

सलाह के लिए धन्यवाद। लेकिन मैंने पहले इस तरह की कोशिश की। यह मेरी मदद नहीं करता है, क्योंकि मैं सीधे उप-वर्ग से नया() नहीं कहता हूं, मैं कोड 'स्थानीय * मॉड्यूल :: नाम :: नया = उप {मॉड्यूल :: नाम :: मॉक-> नया(); }; और फिर मैं @ISA सेट नहीं करता जो यह काम नहीं कर रहा है :( – bor

1
  • तुम सिर्फ पता है कि तरीकों का इस्तेमाल किया जा रहा है चाहते हैं, आप Devel :: NYTProf जैसे कुछ रूपरेखा मॉड्यूल का उपयोग कर सकते हैं।

  • यदि आप अपने प्रोग्राम निष्पादन के दौरान उस पर प्रतिक्रिया करना चाहते हैं, तो आप प्रोफाइलिंग मॉड्यूल के रूप में सीधे एंटर्सब ऑपोड को रोक सकते हैं। अधिक जानकारी के लिए perlguts या प्रोफाइलिंग मॉड्यूल कोड देखें।

  • आप शायद एक 'मॉनिटर' वर्ग लाने और मौजूद है और प्रतीक तालिका हैश की तरह करने के लिए इसे टाई के साथ बना सकते हैं: टाई% मॉड्यूल :: नाम ::, मॉनिटर;

लेकिन जब तक हम जानते हैं कि आप क्या करने की कोशिश कर रहा है और क्यों कर रहे हैं कि वास्तव में क्या है, यह अनुमान लगाना क्या आप के लिए सही समाधान होगा मुश्किल है।

1

कृपया जिरी क्लाउडा के सुझाव पर जोर से विचार करें कि आप वापस कदम उठाते हैं और पुनर्विचार करने की कोशिश कर रहे हैं। आप लगभग कभी ऐसा करना चाहते हैं जो आप करने का प्रयास कर रहे हैं।

लेकिन, यदि आप रहे वास्तव में सुनिश्चित करें कि आप, करना चाहते हैं यहाँ कैसे अपने आप को फांसी के लिए पर्याप्त शुद्ध पर्ल रस्सी प्राप्त करने के लिए है ...

subs pragma predeclare को उप नामों की एक सूची लेता है। जैसा कि ऊपर वर्णित कहता है, आप सब्सक्राइब कर सकते हैं लेकिन वास्तव में उन्हें परिभाषित नहीं करते हैं। यह शॉर्ट सर्किट विधि सुपरक्लास को प्रेषित करेगा और तुरंत आपके ऑटोलोड को कॉल करेगा।

प्रगा को पास करने के लिए उप नामों की सूची के लिए, आप Class::Inspector->methods का उपयोग कर सकते हैं (इस मॉड्यूल के बारे में मुझे सिखाने के लिए Nic Gibson's answer का धन्यवाद)।

Nic गिब्सन की जवाब देने के लिए ब्रायन डी Foy की टिप्पणी के अनुसार, कक्षा :: इंस्पेक्टर यूनिवर्सल में परिभाषित तरीकों को संभाल नहीं होंगे।यदि आपको उन्हें अलग से करने की ज़रूरत है, तो आप मेरे Class::LazyObject मॉड्यूल में 'उपयोग subs' लाइन से प्रेरणा प्राप्त कर सकते हैं।

संबंधित मुद्दे