2017-07-08 13 views
6

कोड संगठन से संबंधित कारणों के लिए, मैं संकलक की जरूरत है निम्नलिखित (सरलीकृत) कोड स्वीकार करने के लिए:जब वेक्टर के बाद उधारित मूल्य बनाए जाते हैं तो मैं वेक्टर में संदर्भ कैसे जोड़ूं?

fn f() { 
    let mut vec = Vec::new(); 
    let a = 0; 
    vec.push(&a); 
    let b = 0; 
    vec.push(&b); 
    // Use `vec` 
} 

संकलक शिकायत

error: `a` does not live long enough 
--> src/main.rs:8:1 
    | 
4 |  vec.push(&a); 
    |    - borrow occurs here 
... 
8 | } 
    |^`a` dropped here while still borrowed 
    | 
    = note: values in a scope are dropped in the opposite order they are created 

error: `b` does not live long enough 
--> src/main.rs:8:1 
    | 
6 |  vec.push(&b); 
    |    - borrow occurs here 
7 |  // Use `vec` 
8 | } 
    |^`b` dropped here while still borrowed 
    | 
    = note: values in a scope are dropped in the opposite order they are created 

हालांकि, मैं एक कठिन समय को समझाने आ रही हैं वेक्टर को संदर्भित करने से पहले वेक्टर को छोड़ने के लिए कंपाइलर। vec.clear() काम नहीं करता है, और न ही drop(vec) करता है। mem::transmute() या तो काम नहीं करता है (vec को 'static होने के लिए मजबूर करने के लिए)।

मुझे मिला एकमात्र समाधान &'static _ में संदर्भ को ट्रांसमिट करना था। क्या कोई और तरीका है? क्या यह सुरक्षित जंग में संकलित करना भी संभव है?

उत्तर

8

क्या यह सुरक्षित जंग में संकलित करना भी संभव है?

नहीं। आपको बस इतना करना कोशिश कर रहे हैं स्वाभाविक असुरक्षित है।

Vec एक चर के संदर्भ में है जो Vec से पहले ही गिरा दिया जाएगा। इसका अर्थ यह है कि Vec के विनाशक के पास उन संदर्भों तक पहुंच है जो मान्य नहीं हैं। विनाशक उन मूल्यों में से एक को हटाना चुन सकता है, जंग की स्मृति सुरक्षा गारंटी को तोड़ सकता है।

यह बेहद संभव है कि Vec ऐसा नहीं करता है, लेकिन संकलक किसी कस्टम प्रकार की तुलना में Vec के बारे में विशेष कुछ भी नहीं जानता है।

ध्यान दें: एक दायरे में मूल्यों विपरीत क्रम में गिरा दिया जाता है वे

संकलक आपको बताता है के रूप में बनाई गई हैं, तो आप अपने कोड को पुन: व्यवस्थित करने की जरूरत है। आप वास्तव में यह नहीं कहा क्या सीमाओं "कोड संगठन से संबंधित कारणों के लिए" हैं, लेकिन सीधे ठीक है:

fn f() { 
    let a = 0; 
    let b = 0; 
    let mut vec = Vec::new(); 
    vec.push(&a); 
    vec.push(&b); 
} 

एक कम स्पष्ट है:

fn f() { 
    let a; 
    let b; 

    let mut vec = Vec::new(); 
    a = 0; 
    vec.push(&a); 
    b = 0; 
    vec.push(&b); 
} 

किसी दिन, जब गैर-अक्षीय जीवनकाल जंग में जोड़ा जाता है, तो आप उधार को प्रभावित करने के लिए drop का उपयोग करने में सक्षम हो सकते हैं।

यह भी देखें:

+0

असल में, कंप्यूटिंग मूल्यों और उन्हें धक्का एक ही मूल्य के लिए एक ही शर्त पर निर्भर कर रहे हैं, लेकिन अलग-अलग मान अलग अलग परिस्थितियों, तो अपनी राशि पहले मामले का अर्थ है 'if' कथन। मूल्यों को वेक्टर में स्थानांतरित नहीं किया जा सकता है क्योंकि वेक्टर में गुण वस्तुओं के संदर्भ होना चाहिए। लेकिन आपका आखिरी मामला ठीक है जो मैं कर रहा हूं। – moatPylon

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