मेरे पास डिस्क पर संग्रह डंप किए गए हैं। अनुरोध किए जाने पर, इन संग्रहों को पुनर्प्राप्त किया जाना चाहिए (कोई समस्या नहीं) और iterator
इसके लिए बनाया जाना चाहिए जो पुनर्प्राप्त मूल्यों के संदर्भ देता है।Iterate। जैसे ही इटरेटर गिरा दिया जाता है, इसे छोड़ दें
iterator
के बाद गिरा दिया गया है, मुझे अब संग्रह की आवश्यकता नहीं है। मैं इसे भी छोड़ना चाहता हूं।
क्या मैं अब तक की कोशिश की है:
Iterator
संग्रह का मालिक है। यह मेरे लिए सबसे ज्यादा समझ में आया, लेकिन यह संभव नहीं है; मुझे पूरा यकीन नहीं है क्यों। कुछ कहते हैं किIterator
next
के लिए लक्षण 'विधि हस्ताक्षर समस्या है। (example)संदर्भ गिनती:
Retriever
एकRc<Vec<usize>>
देता है। मैं मालिकों के मालिक के समान समस्याओं में भाग गया। (example)प्रतिद्वंद्वी को संग्रह का स्वामी होने और इसके संदर्भ को सौंपने देना। मैंने इंटीरियर म्यूटेबिलिटी (
RefCell<HashMap>
) के साथ रेट्रिवर को लागू करने की कोशिश की, लेकिन मैं काफी लंबे समय तकHashMap
में संदर्भ वापस नहीं कर सकता।
मुझे इसके साथ दो मूल संभावनाएं दिखाई देती हैं।
प्रतिद्वंद्वी स्वामित्व स्थानांतरित करता है। फिर
Iterator
को डेटा का स्वामित्व करने की आवश्यकता होगी। कुछ पंक्तियों में:use std::slice::Iter; fn retrieve(id: usize) -> Vec<usize> { //Create Data out of the blue (or disk, or memory, or network. I dont care) //Move the data out. Transfer ownership let data = vec![0, 1, 2, 3]; data } fn consume_iterator<'a, TIterator: Iterator<Item=&'a usize>>(iterator: TIterator) { for i in iterator { println!("{}", i); } } fn handler<'a>(id: usize) -> Iter<'a, usize> { //handle_request now owns the vector. //I now want to build an owning iterator.. //This does of course not compile as vector will be dropped at the end of this method retrieve(id).iter() } fn main() { consume_iterator(handler(0)) }
प्रतिद्वंद्वी संग्रह का मालिक है। लेकिन फिर दो नई समस्याएं उत्पन्न होती हैं:
- इटरेटर रेंज से बाहर होने पर मैं डेटा को कैसे छोड़ सकता हूं?
- मैं उधारकर्ता-चेकर को कैसे बताऊं कि मैं लंबे समय तक संग्रह का मालिक बनूंगा?
use std::cell::{Ref, RefCell}; struct Retriever { //Own the data. But I want it to be dropped as soon as the references to it go out of scope. data: RefCell<Vec<usize>> } impl Retriever{ fn retrieve<'a>(&'a self, id: usize) -> Ref<'a, Vec<usize>> { //Create Data out of the blue (or disk, or memory, or network. I dont care) //Now data can be stored internally and a referece to it can be supplied. let mut data = self.data.borrow_mut(); *data = vec![0, 1, 2, 3]; self.data.borrow() } } fn consume_iterator<'a, TIterator: Iterator<Item=&'a usize>>(iterator: TIterator) { for i in iterator { println!("{}", i); } } fn handler<'a>(ret: &'a Retriever, id: usize) -> IterWrapper<'a> { //andle_request now has a reference to the collection //So just call iter()? Nope. Lifetime issues. ret.retrieve(id).iter() } fn main() { let retriever = Retriever{data: RefCell::new(Vec::new())}; consume_iterator(handler(&retriever, 0)) }
मैं थोड़ा यहाँ खो लग रहा है और कुछ स्पष्ट अनदेखी कर रहा हूँ।
मुझे लगता है कि आपको ['std :: vec :: IntoIter'] की आवश्यकता है (https://doc.rust-lang.org/stable/std/vec/struct.IntoIter.html): https: // play। rust-lang.org/?gist=0e6c171c08fc7a314c44ac98f3dd398e&version=stable&backtrace=0 लेकिन फिर आप इसके बजाय सीधे 'IntoIter' का उपयोग भी कर सकते हैं। – Dogbert
जबकि यह संकलित होगा, 'IntoIter' मानों को ले जाता है। 'Iterator' के प्राप्त होने वाले मान मानों के संदर्भों की अपेक्षा करते हैं। मैं – JDemler
के अनुसार अपना प्रश्न अपडेट करूंगा, मुझे डर है कि आपने किसी भी तरह [XY समस्या] में भाग लिया है (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) ... क्यों यदि आपको मूल्यों की आवश्यकता नहीं है, तो क्या आपको मूल्यों के संदर्भों की आवश्यकता है? उधार लेने का पूरा बिंदु इसलिए है कि आप स्वामित्व रखते हैं, लेकिन स्पष्ट रूप से आप स्वामित्व रखना नहीं चाहते हैं। –