प्रश्न "How can I monkey-patch an instance method in Perl?" मुझे सोचने लगा। क्या मैं गतिशील रूप से पर्ल विधियों को फिर से परिभाषित कर सकता हूं?मैं पर्ल क्लास विधियों को फिर से परिभाषित कैसे कर सकता हूं?
package MyClass;
sub new {
my $class = shift;
my $val = shift;
my $self = { val=> $val};
bless($self, $class);
return $self;
};
sub get_val {
my $self = shift;
return $self->{val}+10;
}
1;
और कहते हैं कि दो नंबर जोड़ने वास्तव में महंगा है चलो: मैं इस तरह एक वर्ग है कहो।
मैं कक्षा को संशोधित करना चाहता हूं ताकि $ val + 10 केवल उस वस्तु पर विधि को कॉल करने पर पहली बार गणना की जाए। विधि के बाद के कॉल एक कैश मूल्य लौटाएंगे।
मैं आसानी से कैशिंग शामिल करने के लिए विधि को संशोधित सकता है, लेकिन:
- मैं इस तरह के तरीकों का एक समूह है।
- मैं इस विधि को गंदे नहीं करना चाहता हूं।
जो मैं वास्तव में करना चाहता हूं वह उन तरीकों की एक सूची निर्दिष्ट करता है जो मुझे पता है कि किसी दिए गए उदाहरण के लिए हमेशा एक ही मान वापस आते हैं। मैं फिर इस सूची को लेना चाहता हूं और उन तरीकों को कैशिंग समर्थन जोड़ने के लिए इसे एक समारोह में भेजना चाहता हूं
क्या इसे पूरा करने का कोई प्रभावी तरीका है?
फ़ॉलो करें। नीचे दिया गया कोड काम करता है, लेकिन क्योंकि सख्त उपयोग स्ट्रिंग द्वारा संदर्भों की अनुमति नहीं देता है, मैं 100% नहीं हूं जहां मैं बनना चाहता हूं।
sub myfn {
printf("computing\n");
return 10;
}
sub cache_fn {
my $fnref = shift;
my $orig = $fnref;
my $cacheval;
return sub {
if (defined($cacheval)) { return $cacheval; }
$cacheval = &$orig();
return $cacheval;
}
}
*{myfn} = cache_fn(\&myfn);
कैसे मैं सिर्फ इस ?:
cache_fn(&myfn);
{कोई चेतावनी 'redefine' नहीं; * myfn = cache_fn (\ &myfn);} - यह संदिग्ध और चेतावनी को फिर से परिभाषित करने से छुटकारा पाता है। cache_fn (&myfn); – draegtun
) के बारे में मेरा नया उत्तर देखें, आप यादों को देखना चाहते हैं (कुछ अच्छे सीपीएएन मॉड्यूल हैं), या महंगे कैश करने के लिए मूस ट्रिगर्स का उपयोग करना विशेषताओं में संगणना और उन्हें के रूप में चलाता साथ की जरूरत पुनर्गणना – Ether