2012-05-27 13 views
14

मान लें कि मेरे पास एक पर्ल क्लास है जिसमें एक DESTROY विधि है। इस विधि का उपयोग बाह्य संसाधन, जैसे फाइल हैंडल या डेटाबेस लेनदेन को स्पष्ट रूप से जारी करने के लिए किया जाता है।आप पर्ल में किसी वस्तु को स्पष्ट रूप से कैसे नष्ट कर सकते हैं?

इस कक्षा के एक उदाहरण को देखते हुए, मैं इसे स्पष्ट रूप से नष्ट करना चाहता हूं। इसका प्राथमिक उद्देश्य DESTROY विधि को बुलाया जाना है ताकि बाह्य संसाधन जारी किया जा सके। हालांकि, स्मृति से खुद को जारी किया गया "ऑब्जेक्ट" होना एक अतिरिक्त लाभ होगा।

मैं यह कैसे कर सकता हूं? मैंने सीधे DESTROY विधि को कॉल करने और ऑब्जेक्ट को संदर्भित करने वाले किसी भी चर को अपरिभाषित करने पर विचार किया है। जब तक आप स्वयं निर्देशात्मक ढांचे (Destructors और दो चरण कचरा संग्रहण कुछ रोचक जानकारी के लिए उस के बाद पैरा देखें)

उत्तर

17

Perl5 वस्तुओं जैसे ही उन्हें अंतिम संदर्भ गायब हो जाता है विलुप्त हो,।

यदि आपके पास आत्म-संदर्भ नहीं हैं, तो आपको किसी भी चीज़ के बारे में चिंता करने की आवश्यकता नहीं है, DESTROY विधि होने पर इसे कॉल किया जाएगा; ऑब्जेक्ट को नष्ट करने की कोशिश करने से आप सुरक्षित नहीं होंगे (आप कैसे सुनिश्चित कर सकते हैं कि ऑब्जेक्ट कहीं और संदर्भ नहीं है), जब तक कि आप खुद को गिनती करने वाले संदर्भ भी नहीं कर रहे हैं (यदि यह वास्तव में संभव है, और यह पर्ल के प्रयासों को डुप्लिकेट करेगा, जो कि इतना अच्छा विचार नहीं है)। आप अपने कोड में एक विशिष्ट बिंदु पर बाह्य संसाधनों को रिहा करना चाहते हैं

  • , एक release/close के साथ इतना स्पष्ट रूप से कार्य करें:

    तो मैं, जैसा कि आप चक्रीय संदर्भ की जरूरत नहीं है कहेंगे जब तक/dispose/जो भी तरीका (कि आपका DESTROY कोड भी कॉल कर सकता है)।

  • यदि आपको वास्तव में परवाह नहीं है कि रिलीज वास्तव में आपके कोड में उस बिंदु पर होता है, तो बस इसे अंततः कॉल किया जाता है, इसके बारे में चिंता न करें।
  • पर्ल ऑब्जेक्ट के बारे में चिंता न करें।

आप चक्रीय संदर्भ है, तो आप और अधिक सावधान रहने की जरूरत है, और चक्र को तोड़ने के लिए कमजोर संदर्भ का उपयोग (Scalar::Util देखें) होगा।

(दूसरे शब्दों में, मैं एक तरह से स्पष्ट रूप से delete एक पर्ल वस्तु। यही कारण है कि एक संदर्भ बार गणना कचरा संग्रहण प्रणाली के साथ अच्छी तरह से काम नहीं करता है के लिए के बारे में पता नहीं है।)

+0

आपको लगता है कि वस्तुओं को नष्ट कर रहे बिल्कुल के बाद वे unreferenced बन कुछ कर रहे हैं? क्या आप किसी भी आधिकारिक स्रोत के बारे में जानते हैं जो इसकी पुष्टि करता है? मैंने सोचा कि कचरा कलेक्टर द्वारा इस तरह के व्यवहार की गारंटी नहीं थी। – Sam

+1

दस्तावेज़ मैंने उद्धृत किया: "जब किसी ऑब्जेक्ट का अंतिम संदर्भ दूर हो जाता है, तो ऑब्जेक्ट स्वचालित रूप से नष्ट हो जाता है"। लेकिन जैसा कि मैंने कहा, अगर आप किसी दिए गए बिंदु पर बाहरी संसाधनों को छोड़ना चाहते हैं तो इसे स्पष्ट करें। यह perl5 btw के लिए है, perl6 संभावित रूप से एक अंतर संग्रह योजना है। – Mat

4

आप undef उपयोग कर सकते हैं एक वस्तु को स्पष्ट रूप से नष्ट करने के लिए। नीचे दिया गया कोड इसे दिखाता है।

package MyPackage; 

sub new { 
    print "In new\n"; 
    return bless {}; 
} 

sub DESTROY { 
    print "In DESTROY\n"; 
} 

package main; 

my $Obj = MyPackage->new(); 
<STDIN>; 
undef $Obj; 
<STDIN>; 
+11

'undef' केवल ऑब्जेक्ट को नष्ट कर देता है यदि आप जो भी देते हैं वह अंतिम संदर्भ है। 'Undef' से पहले 'मेरा $ Cpy = $ Obj;' जोड़ने का प्रयास करें, आपको प्रोग्राम के अंत से पहले नष्ट नष्ट नहीं दिखाई देगा। – Mat

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

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