2015-11-09 6 views
5

यह कोड सही ढंग से संकलित करता है। इसमें कुछ अप्रयुक्त कोड चेतावनियां हैं, लेकिन यह अभी ठीक है।संदर्भों के वेक्टर का उपयोग कब और कैसे करें

use std::collections::BTreeMap; 

enum Object<'a> { 
    Str(String), 
    Int(i32), 
    Float(f32), 
    Vector(Vec<&'a Object<'a>>), 
    Prim(fn(State) -> State) 
} 

struct State<'a> { 
    named: BTreeMap<String, &'a Object<'a>>, 
    stack: Vec<Object<'a>> 

} 

impl<'a> State<'a> { 
    fn push_int(&mut self, x: i32) { 
     self.stack.push(Object::Int(x)); 
    } 
} 


fn main() { 
    println!("Hello, world!"); 
    let obj = Object::Str("this is a test".to_string()); 
} 

इस कोड के महत्वपूर्ण हिस्सा push_int और stack: Vec<Object<'a>> है।

मैं एक स्टैक-आधारित वीएम बनाने की कोशिश कर रहा हूं। मैं राज्य को कार्य करने के लिए पास करना चाहता हूं, जो स्टैक से सामान ले सकता है, सामानों में हेरफेर कर सकता है, और उसके बाद कुछ सामान वापस ढेर पर रख सकता है; नामित क्षेत्र नामित वस्तुओं को पकड़ने जा रहा है।

मेरे पास एक झुकाव है कि स्टैक को Vec<&'a Object<'a>> के रूप में प्रदर्शित करना बेहतर होगा। जिस तरह से मेरे पास अब है, मुझे डर है कि मैं कुछ अक्षमता त्रुटि कर रहा हूं। क्या मेरा झुकाव सही है?

समस्या का दूसरा भाग यह है कि मुझे नहीं पता कि संदर्भ संस्करण के वेक्टर को कैसे काम करना है। ढेर पर धक्का देने के लिए सही जीवनकाल के साथ नया मूल्य बनाना मेरे लिए काम नहीं कर रहा है।

मैं इस मुद्दे के बारे में थोड़ा अस्पष्ट हूं, इसलिए यदि मैं अस्पष्ट हूं, तो मुझे सामान साफ़ करने के लिए प्रश्न पूछें।

+0

आप एक स्वामित्व वाले सूचक के लिए 'Vec >> 'चाहते हैं।आपके पास अक्षमता है, उस ऑब्जेक्ट :: Int' में 'ऑब्जेक्ट :: स्ट्रिंग' के रूप में ज्यादा जगह लेती है, लेकिन मुक्केबाजी यह सिर्फ इसे खराब कर रही है (भले ही मुक्केबाजी को अधिक कॉम्पैक्ट प्रस्तुतिकरण की अनुमति दी जाए)। मैं बस 'स्ट्र (स्ट्रिंग)' से 'स्ट्र (बॉक्स )' और 'वेक्टर >' वेक्टर >> 'को' 'वेंटर >>' में बदल दूंगा, और इसे उस पर छोड़ दें, क्योंकि इससे 'ऑब्जेक्ट' * को रखने वाली केवल चीजों को हटा दिया जाता है * विशाल। यह अभी भी संभव है कि अतिरिक्त संकेत केवल छोटे (शायद अधिक आम) मानों के लिए अक्षमता से भी बदतर है। – Veedrac

+1

"अक्षमता" के साथ आपका क्या मतलब है? क्या आप पूछ रहे हैं कि स्मृति को कैसे बचाया जाए या कैसे अधिक प्रदर्शन किया जाए? मुझे यह भी लगता है कि यह प्रश्न http://codereview.stackexchange.com/ –

+0

@ker पर है, मुझे लगता है कि मेरा मतलब था; मैं अस्पष्ट था क्योंकि मुझे और अधिक विशिष्ट होने के लिए पर्याप्त जानकारी नहीं थी। हाँ, यह कोडरेव में जा सकता था; मुझे यकीन नहीं था। – phil

उत्तर

6

कारण यह है कि आप इसे काम नहीं कर पाएंगे कि structs में ऐसे फ़ील्ड नहीं हो सकते हैं जो अन्य क्षेत्रों को संदर्भित करते हैं। (नीचे दिए गए लिंक का समर्थन देखें।)

आप क्या कर सकते हैं, अपने Vec में सभी Object रों डाल दिया जाता है, और HashMap नामित तत्वों यह संदर्भ देता है के सूचकांकों को शामिल किया है।

struct State { 
    named: BTreeMap<String, usize>, 
    stack: Vec<Object> 
} 

मैं आपके उदाहरण से सभी जीवनकाल भी हटा दूंगा, क्योंकि यह स्वामित्व वाली वस्तुओं के साथ पूरी तरह से किया जा सकता है।

enum Object { 
    Str(String), 
    Int(i32), 
    Float(f32), 
    Vector(Vec<Object>), 
    Prim(fn(State) -> State) 
} 

आप Playground

सहायक लिंक में एक काम कार्यान्वयन की कोशिश कर सकते हैं:

+2

"के बारे में एक शैली बिंदु" (हाँ, हर शब्द एक अलग लिंक है) "। अन्य स्टैक ओवरफ़्लो प्रश्नों के लिंक की बुलेट सूची ब्राउज़ करने के लिए स्पष्ट है, क्योंकि एसओ स्वचालित रूप से खिताब देखेगा और उन्हें दिखाएगा। –

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