2013-03-13 6 views
18

यह वर्तमान 0.6 जंग के ट्रंक ट्रंक के लिए है, निश्चित रूप से सटीक प्रतिबद्धता सुनिश्चित नहीं है।मैं जंग में ~ str में कैसे बदल सकता हूं?

मान लें कि मैं कुछ तारों में से प्रत्येक के लिए चाहता हूं, और मेरा बंद एक उधार स्ट्रिंग पॉइंटर तर्क (str) लेता है। मैं चाहता हूं कि मेरा बंद स्वामित्व वाले तारों के स्वामित्व वाले वेक्टर ~ [~ str] को वापस लौटाया जाए। जंग की मेरी समझ कमजोर है, लेकिन मुझे लगता है कि तार एक विशेष मामला है जहां आप उन्हें सही * से वंचित नहीं कर सकते हैं? मैं अपने स्ट्रिंग्स को & स्ट्र से वेक्टर की पुश विधि में कैसे प्राप्त करूं जो ~ str लेता है?

यहाँ कुछ कोड है कि

fn read_all_lines() -> ~[~str] { 
    let mut result = ~[]; 
    let reader = io::stdin(); 
    let util = @reader as @io::ReaderUtil; 
    for util.each_line |line| { 
     result.push(line); 
    } 
    result 
} 

यह संकलन नहीं करता क्योंकि यह बाद से है कि क्या मैं इसे पर जोर दे रहा हूँ [& str] होने के लिए परिणाम के प्रकार का निष्कर्ष निकालते है संकलन नहीं करता है। इसका जीवनकाल उल्लेख नहीं करना गलत होगा क्योंकि मैं इसमें एक छोटा-सा परिवर्तनीय चर जोड़ रहा हूं।

मुझे एहसास है कि मैं ReaderUtil की read_line() विधि का उपयोग कर सकता हूं जो ~ str। लेकिन यह सिर्फ एक उदाहरण है।

तो, मैं उधार वाली स्ट्रिंग से स्वामित्व वाली स्ट्रिंग कैसे प्राप्त करूं? या मैं पूरी तरह से गलतफहमी हूँ।

+0

यह अब यह देखते हुए कि जंग 1 पर है कम प्रासंगिक है। एक्स। (जंग 1।एक्स 'स्ट्रिंग' और' और str' का उपयोग करता है, न कि '~ str') तो, इसे प्री-रस्ट 1.0 के रूप में लेबल करने में मददगार होगा। मेरी आशा है कि खोज इंजन प्रासंगिकता तदनुसार समायोजित की जा सकती है। –

+0

मैं यहां लाइन से बाहर हो सकता हूं, लेकिन मैंने इस सवाल को बंद करने के लिए वोट दिया है क्योंकि यह वर्तमान जंग वाक्यविन्यास पर लागू नहीं होता है, जिसमें ~ –

उत्तर

11

आप के रूप StrSlice विशेषता की विधि, to_owned, बुलाना चाहिए:

fn read_all_lines() -> ~[~str] { 
    let mut result = ~[]; 
    let reader = io::stdin(); 
    let util = @reader as @io::ReaderUtil; 
    for util.each_line |line| { 
     result.push(line.to_owned()); 
    } 
    result 
} 

StrSlice विशेषता डॉक्स यहां हैं:

http://static.rust-lang.org/doc/core/str.html#trait-strslice

4

आप नहीं कर सकते।

एक के लिए, यह semantically काम नहीं करता है: ~str वादा करता है कि केवल एक चीज एक समय पर इसका मालिक है। लेकिन &str उधार लिया जाता है, तो आपके द्वारा उधार ली गई जगह का क्या होता है? इसका यह जानने का कोई तरीका नहीं है कि आप अपने एकमात्र संदर्भ को दूर करने की कोशिश कर रहे हैं, और इसके अलावा कॉलर के डेटा को इसके अलावा बाहर कचरा करना बहुत मुश्किल होगा।

दूसरे के लिए

, यह तार्किक काम नहीं करता है: ~ -pointers और @ -pointers पूरी तरह से अलग ढेर में आवंटित किए जाते हैं, और एक & पता नहीं है जो ढेर, तो यह ~ और को नहीं बदला जा सकता अभी भी गारंटी है कि अंतर्निहित डेटा सही जगह पर रहता है।

तो तुम read_line उपयोग कर सकते हैं या एक प्रति है, जो मैं कर रहा हूँ ... काफी कैसे करना है यकीन नहीं कर :)

मुझे आश्चर्य है कि क्यों एपीआई, इस तरह है जब & सबसे प्रतिबंधित है पॉइंटर्स के। ~ को यहां भी काम करना चाहिए; ऐसा लगता है कि पुनरावृत्त तार पहले से मौजूद नहीं हैं और उधार लेने के लिए की आवश्यकता है।

+0

धन्यवाद शामिल नहीं है। इसके बहुत सारे अर्थ निकलते हैं। – Ross

4

पहले मैंने सोचा था कि उधारित पॉइंटर से स्ट्रिंग में मालिक बनने के लिए copy line का उपयोग करना संभव था लेकिन यह स्पष्ट रूप से प्रतिबिंबित सूचक की प्रतिलिपि बनाता है।

तो मुझे str::from_slice(s: &str) -> ~str मिला। यह शायद आपको चाहिए।

+0

मैंने "कॉपी लाइन" भी कोशिश की। यह मेरे लिए अजीब लग रहा था कि वे सभी लाइनों को पढ़ने का एक तरीका प्रदान करेंगे, लेकिन यह आपको उधारकर्ता पॉइंटर्स देता है और आप उन्हें कॉपी नहीं कर सकते हैं। ऐसा लगता है कि str :: from_slice एक असुरक्षित कच्ची बाइट प्रति का उपयोग करता है। – Ross

+1

हां, यह स्ट्रिंग की प्रति बनाता है। बस मालिक को बनाने के लिए आपको क्या चाहिए। मुझे नहीं लगता कि अगर यह इरादे के अनुसार काम करता है तो फ़ंक्शन के नीचे असुरक्षित कॉल है। वैसे भी हमारे पास गहरे स्तर पर असुरक्षित संचालन है। –

+4

'.to_str() 'भी काम करना चाहिए। – brson

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