2016-05-23 7 views
6

मुझे अपने फ़ंक्शन को खिलाने के लिए PathBuf वैरिएबल को String में कनवर्ट करना होगा। मेरा कोड इस तरह है:PathBuf से स्ट्रिंग को कैसे परिवर्तित करें

let cwd = env::current_dir().unwrap(); 
let my_str: String = cwd.as_os_str().to_str().unwrap().to_string(); 
println!("{:?}", my_str); 

यह काम करता है लेकिन cwd.as_os_str… के साथ भयानक है। क्या आपके पास इसे और अधिक सुविधाजनक तरीका या इसे संभालने के तरीके पर कोई सुझाव है?

उत्तर

6

यह उद्देश्य पर आसान नहीं है: String यूटीएफ -8 एन्कोडेड हैं, लेकिन PathBuf हो सकता है (उदाहरण के लिए विंडोज़ पर)। तो रूपांतरण विफल हो सकता है।

सुविधा के लिए to_str और to_string_lossy विधियां भी हैं। पूर्व संभावित विफलता को इंगित करने के लिए Option<&str> लौटाता है और बाद में हमेशा सफल होगा लेकिन U+FFFD REPLACEMENT CHARACTER के साथ गैर-यूटीएफ -8 अक्षरों को प्रतिस्थापित करेगा (यही कारण है कि यह Cow<str> देता है: यदि पथ पहले से ही मान्य यूटीएफ -8 है, तो यह एक संदर्भ वापस करेगा आंतरिक बफर लेकिन यदि कुछ पात्रों को प्रतिस्थापित किया जाना है, तो इसके लिए यह एक नया String आवंटित करेगा; यदि आप वास्तव में String की आवश्यकता है तो दोनों मामलों में आप into_owned का उपयोग कर सकते हैं)।

+0

क्या आप 'गाय' और 'in_owned()' का उपयोग करने के संकेत के बारे में एक संक्षिप्त स्पष्टीकरण जोड़ सकते हैं? या मैं इसे जोड़ने के लिए अपना जवाब संपादित कर सकता हूं? –

+0

बहुत बहुत धन्यवाद। गाय के उपयोग के लिए @ लुकास कलबर्टोड, आप इस ब्लॉग का उल्लेख कर सकते हैं: http://hermanradtke.com/2015/05/29/creating-a-rust-function-that-returns-string-or-str.html – xiaoai

2

चूंकि mcarton पहले से ही इतना आसान नहीं है और सभी पथ यूटीएफ -8 एन्कोडेड नहीं हैं। लेकिन आप इसका उपयोग कर सकते हैं:

p.into_os_string().into_string() 

इसका अच्छा नियंत्रण रखने के लिए। ? करके आप ऊपरी स्तर को त्रुटि भेज सकते हैं या बस unwrap() द्वारा इसे अनदेखा कर सकते हैं:

let my_str = cwd.into_os_string().into_string().unwrap(); 

सौंदर्य चीज़ के बारे में into_string() कि त्रुटि मूल OsString मूल्य लपेटो है।

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