2014-11-20 3 views
60

नोट: इस प्रश्न में पूर्व-1.0 कोड बहिष्कृत है! जवाब सही है, यद्यपि।जंग में int के लिए एक स्ट्रिंग कनवर्ट करें?

एक str जंग में एक int में कन्वर्ट करने के लिए, मैं यह कर सकता:

let my_int = from_str::<int>(my_str); 

एक ही रास्ता मैं कैसे कन्वर्ट करने के लिए पता है एक String एक int करने के लिए इसे का एक हिस्सा मिल और फिर उपयोग करने के लिए है from_str उस पर तो जैसे:

let my_int = from_str::<int>(my_string.as_slice()); 

वहाँ एक रास्ता सीधे एक int करने के लिए एक String कन्वर्ट करने के लिए है?

+0

यह भी देखें: http://stackoverflow.com/q/32381414/500207 गैर-दशमलव (यानी हेक्स) के लिए। –

उत्तर

81

आप सीधे str::parse::<T>() method का उपयोग कर एक int में परिवर्तित कर सकते हैं।

let my_string = "27".to_string(); // `parse()` works with `&str` and `String`! 
let my_int = my_string.parse::<i32>().unwrap(); 

आप के रूप में ऊपर या स्पष्ट प्रकार टिप्पणी द्वारा दिखाए प्रकार turbofish ऑपरेटर (::<>) के साथ करने के लिए पार्स करने के लिए निर्दिष्ट या तो कर सकते हैं:

let my_int: i32 = my_string.parse().unwrap(); 

टिप्पणी में उल्लेख किया है, parse() रिटर्न एक Result। यह परिणाम Err होगा यदि स्ट्रिंग को निर्दिष्ट प्रकार के रूप में पार्स नहीं किया जा सका (उदाहरण के लिए, स्ट्रिंग "peter" को i32 के रूप में पार्स नहीं किया जा सकता है)।

+19

ध्यान दें कि ['पार्स' 'परिणाम' लौटाता है] (http://doc.rust-lang.org/std/primitive.str.html#method.parse), इसलिए आपको उस उचित तरीके से निपटने की आवश्यकता है एक वास्तविक अभिन्न प्रकार। – Shepmaster

+12

इसके अलावा, भाषा से 'int' हटा दिया गया है। इसके बजाय एक विशिष्ट आकार ('u8',' u32', आदि) का उपयोग करें। – Shepmaster

5
हाल ही में एक रात के साथ

, तो आप ऐसा कर सकते हैं:

let my_int = from_str::<int>(&*my_string); 

यहाँ क्या हो रहा है कि String अब एक str में dereferenced जा सकता है। हालांकि, फ़ंक्शन &str चाहता है, इसलिए हमें फिर से उधार लेना होगा। संदर्भ के लिए, मेरा मानना ​​है कि यह विशेष पैटर्न (&*) को "क्रॉस-उधार" कहा जाता है।

+0

ठीक है, मैं नाइटलाइज़ पर नहीं हूं लेकिन मैं इसे एक उत्तर के रूप में स्वीकार करूंगा क्योंकि मैंने वास्तव में एक बिंदु पर 'स्ट्रिंग' को कम करने की कोशिश की थी और उम्मीद थी कि यह काम करेगा। – mtahmed

+2

वैकल्पिक रूप से, आप 'my_sttring.as_slice()' को 'my_string []' के रूप में व्यक्त कर सकते हैं (वर्तमान में 'slicing_syntax' फीचर-गेटेड है, लेकिन शायद इसका कुछ रूप भाषा में समाप्त हो जाएगा)। – tempestadept

0

अच्छा, नहीं। क्यों होना चाहिए? यदि आपको इसकी आवश्यकता नहीं है तो बस स्ट्रिंग को छोड़ दें।

&strString से अधिक उपयोगी है जब आपको केवल स्ट्रिंग को पढ़ने की आवश्यकता होती है, क्योंकि यह डेटा के मूल भाग में केवल एक दृश्य है, न कि इसके मालिक। आप इसे String से अधिक आसानी से पारित कर सकते हैं, और यह कॉपी करने योग्य है, इसलिए इसे लागू विधियों से उपभोग नहीं किया जाता है। इस संबंध में यह अधिक सामान्य है: यदि आपके पास String है, तो आप इसे &str कहां से पास कर सकते हैं, लेकिन यदि आपके पास &str है, तो आप इसे String की उम्मीद कर सकते हैं यदि आप नया आवंटन करते हैं।

आप इन दोनों के बीच अंतर और official strings guide में उनका उपयोग कब कर सकते हैं।

+0

खैर, मेरी राय में, "वहां होना चाहिए" के लिए एक स्पष्ट कारण यह है कि मुझे हर बार '.as_slice()' को स्ट्रिंग पर 'से_स्ट्र' करने की आवश्यकता नहीं होती है। उदाहरण के लिए, कमांड लाइन तर्क, एक ऐसा स्थान है जहां मुझे उन सभी तर्कों पर 'int_str' करने की आवश्यकता है, जिन्हें उन्हें' int 'आदि के रूप में समझने के लिए – mtahmed

+0

'as_slice()' स्ट्रिंग हैंडलिंग का केवल एक मामूली पहलू है। उदाहरण के लिए, आप स्लाइसिंग सिंटैक्स ('s []') का उपयोग कर सकते हैं या 'डेफ' जबरदस्ती ('& * s') का फायदा उठा सकते हैं। यहां एक प्रस्ताव भी है जो केवल 'एस' लिखने की अनुमति देगा। –

+0

ओहोह! एक स्ट्रिंग के लिए क्या करेंगे? क्या यह 'str' वापस दे देगा? क्या आप मुझे प्रस्ताव के लिए इंगित कर सकते हैं? – mtahmed

29
let my_u8: u8 = "42".parse::<u8>().unwrap(); 
let my_u32: u32 = "42".parse::<u32>().unwrap(); 

// or, to be safe, match the `Err` 
match "foobar".parse::<i32>() { 
    Ok(n) => do_something_with(n), 
    Err(e) => weep_and_moan(), 
} 

parse रिटर्न एक core::result::Result<u32, core::num::ParseIntError> और unwrap "विकल्प से बाहर मूल्य v ले जाता है अगर यह होता है कुछ (v) [या] घबरा अगर आत्म मूल्य नहीं के बराबर होती है"।

parsegeneric function है, इसलिए कोण को ब्रैकेट में टाइप करें।

+6

यदि आप चर के प्रकार निर्दिष्ट करते हैं ('my_u8: u8'), तो आपको कोण ब्रैकेट में मान की आवश्यकता नहीं है। यह भी ध्यान रखें कि प्रचलित जंग की शैली इंगित करती है कि ':' को बाईं तरफ रहना चाहिए। – Shepmaster

+3

विशेष रूप से, मेरा मतलब था 'मेरा_यू 32: u32 = "42" .parse()। Unwrap() ' – Shepmaster

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