जंग के लिए एक सीखने की परियोजना के रूप में, मेरे पास एक सिंगल लिंक्ड सूची का एक बहुत ही सरल (काम करने वाला, अगर अधूरा) कार्यान्वयन है। structs की घोषणा इस तरह दिखता है:पूंछ सूचक के साथ एक लिंक्ड सूची लिखने का बेवकूफ तरीका क्या है?
type NodePtr<T> = Option<Box<Node<T>>>;
struct Node<T> {
data: T,
next: NodePtr<T>,
}
pub struct LinkedList<T> {
head: NodePtr<T>,
}
को लागू करने size
और push_front
दोनों यथोचित सीधी-सपाट थे, हालांकि कर आकार iteratively शामिल था कुछ "उधार चेकर के साथ लड़ रहे हैं।"
अगली चीज़ जो मैं कोशिश करना चाहता था tail
पॉइंटर LinkedList
संरचना में जोड़ रहा था। एक कुशल push_back
ऑपरेशन सक्षम करने के लिए। यहाँ मैं एक दीवार में भाग गया है। पहले मैंने Option<&Box<Node<T>>>
और फिर Option<&Node<T>>
का उपयोग करने का प्रयास किया। उन दोनों ने 'a
एस हर जगह छिड़कने का नेतृत्व किया, लेकिन अंत में जीवन भर के चेकर का वादा करने में असमर्थ रहा कि tail
मान्य होगा।
मैं के बाद से जांच निष्कर्ष यह है कि यह इन परिभाषाओं के साथ असंभव है के लिए आए हैं: गारंटी संकलक कि tail
स्थानों मुझे लगता है कि यह मान्य है में मान्य होगा करने के लिए कोई रास्ता नहीं है कि वहाँ। एकमात्र तरीका यह है कि मैं संभवतः यह पूरा कर सकता हूं कि मेरे सभी पॉइंटर्स Rc<_>
या Rc<RefCell<_>>
हो, क्योंकि वे एक ही ऑब्जेक्ट (अंतिम नोड) पर इंगित करने वाली दो चीजें रखने का एकमात्र सुरक्षित तरीका हैं।
मेरा प्रश्न: क्या यह सही निष्कर्ष है? अधिक आम तौर पर: डेटा संरचनाओं के अंदर अज्ञात पॉइंटर्स के लिए बेवकूफ जंग समाधान क्या है? मेरे दिमाग में, संदर्भ गिनती इतनी सरल के लिए भारी वजन लगती है, इसलिए मुझे लगता है कि मुझे कुछ याद आना चाहिए। (या शायद मैं सिर्फ मेरे मन स्मृति सुरक्षा के लिए सही मानसिकता में अभी तक मिल गया है नहीं।)
आप सही हैं; 'आरसी' जैसी चीजों द्वारा प्रदान किए गए साझा स्वामित्व के बिना सुरक्षित जंग में चक्रों को व्यक्त करना संभव नहीं है। –
यह मेरे प्रश्न का सही उत्तर जैसा दिखता है, लेकिन मैं वास्तव में साझा स्वामित्व साझा नहीं करना चाहता हूं। मुझे लगता है कि मैं 'आरसी' के अलावा 'std :: rc :: कमजोर' के साथ कुछ खेल रहा हूं, क्योंकि मैंने अभी देखा है कि पूर्व मौजूद है। शीघ्र जवाब देने के लिए ध्न्यवाद! – GrandOpener
* मेरे दिमाग में, संदर्भ गिनती इतनी सरल * => के लिए बहुत भारी वजन लगती है जब आप स्वामित्व के मुद्दों (जो डेटा के प्रत्येक टुकड़े का मालिक है) पर अपनी आंखें खोलना शुरू करते हैं, तो आपको पता चलेगा कि सादगी का आपका प्रभाव गलत है:) –