2014-10-30 6 views
11

मैं एक त्रुटि में भाग का उपयोग कर:"उधार मूल्य काफी देर तक नहीं रहते" जब as_slice()

extern crate serialize; 

use serialize::base64::{mod, ToBase64, FromBase64}; 

fn main() { 

    let a: [u8, ..30] = [123, 34, .....]; 
    let b = a.from_base64().as_slice(); 
    println!("{}", b); 
} 

त्रुटि:

error: borrowed value does not live long enough 
let b = a.from_base64().as_slice(); 

मेरे लिए, कोड कोई गलत कर सकते हैं, हालांकि। मुझे यह त्रुटि क्यों है?

+1

ध्यान दें कि 'चलो एक: [u8, ..30] = [123, 34, ...];' के रूप में आप लंबाई अनुकूल करने के लिए जब भी आप सरणी बदलने है महती हो सकता है। यदि आप लंबाई को दस्तावेज करना चाहते हैं, तो यह ठीक है, अगर आपको इसकी आवश्यकता नहीं है और दर्द महसूस होता है, तो इसे व्यक्त करने का एक और तरीका है: 'एक = [123u8, 34, ...]; '। कुंजी यह है कि '123' और' 34' केवल सामान्य एकीकृत (कोई विशिष्ट प्रकार नहीं) हैं, इसलिए आप उन्हें 'u8' निर्दिष्ट करके बाध्य कर रहे हैं; हालांकि, क्योंकि सरणी समरूप कंटेनर हैं, एक और समाधान एक के प्रकार को रोकना है (पहला, आम तौर पर, इसलिए '123u8') और संकलक कटौती करता है कि सभी 'u8' हैं! –

उत्तर

14

समस्या यह है कि आप कहीं भी from_base64 के परिणाम संग्रहीत नहीं कर रहे हैं और फिर as_slice पर कॉल करके संदर्भ लेते हैं। इस तरह की चेनिंग कॉल लाइन के अंत में दायरे से बाहर निकलने के लिए from_base64 के परिणाम का कारण बनती है और संदर्भ लेना अब मान्य नहीं है।

as_slice को Result पर कॉल करने से सावधान रहें क्योंकि डिकोडिंग त्रुटि के मामले में यह प्रोग्राम को घबराएगा और क्रैश करेगा।

extern crate serialize; 

use serialize::base64::{mod, ToBase64, FromBase64}; 

fn main() { 

    let a: [u8, ..30] = [123, 34, .....]; 
    let b = a.from_base64(); 
    println!("{}", b.as_slice()); 
    // <-- b's (result of from_base64) lifetime now ends here 
} 
+5

'यहां समस्या यह है कि आप कहीं भी _base64 के परिणाम संग्रहीत नहीं कर रहे हैं और फिर as_slice को कॉल करके संदर्भ लेते हैं - क्यों? मैं इसे किसी भी अन्य प्रोग्रामिंग भाषा में कर सकता हूं और यह काम करेगा। –

+1

इस प्रकार वर्तमान में चीजें हैं, [आरएफसी 31] (https://github.com/kballard/rfcs/blob/2d3ff42b821ab80bd6a7b3b8fda0e1c238cc7de0/active/0000-better-temporary-lifetimes.md) इसे ठीक करेगा। – Arjan

+0

तो भले ही a.from_base64() 'a' नहीं बदलता है और एक नया चर उत्पन्न करता है, यह अब जंग में नहीं है? –

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