यह कोड सही ढंग से संकलित करता है। इसमें कुछ अप्रयुक्त कोड चेतावनियां हैं, लेकिन यह अभी ठीक है।संदर्भों के वेक्टर का उपयोग कब और कैसे करें
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>>
के रूप में प्रदर्शित करना बेहतर होगा। जिस तरह से मेरे पास अब है, मुझे डर है कि मैं कुछ अक्षमता त्रुटि कर रहा हूं। क्या मेरा झुकाव सही है?
समस्या का दूसरा भाग यह है कि मुझे नहीं पता कि संदर्भ संस्करण के वेक्टर को कैसे काम करना है। ढेर पर धक्का देने के लिए सही जीवनकाल के साथ नया मूल्य बनाना मेरे लिए काम नहीं कर रहा है।
मैं इस मुद्दे के बारे में थोड़ा अस्पष्ट हूं, इसलिए यदि मैं अस्पष्ट हूं, तो मुझे सामान साफ़ करने के लिए प्रश्न पूछें।
आप एक स्वामित्व वाले सूचक के लिए 'Vec >> 'चाहते हैं।आपके पास अक्षमता है, उस ऑब्जेक्ट :: Int' में 'ऑब्जेक्ट :: स्ट्रिंग' के रूप में ज्यादा जगह लेती है, लेकिन मुक्केबाजी यह सिर्फ इसे खराब कर रही है (भले ही मुक्केबाजी को अधिक कॉम्पैक्ट प्रस्तुतिकरण की अनुमति दी जाए)। मैं बस 'स्ट्र (स्ट्रिंग)' से 'स्ट्र (बॉक्स )' और 'वेक्टर >' वेक्टर >> 'को' 'वेंटर >>' में बदल दूंगा, और इसे उस पर छोड़ दें, क्योंकि इससे 'ऑब्जेक्ट' * को रखने वाली केवल चीजों को हटा दिया जाता है * विशाल। यह अभी भी संभव है कि अतिरिक्त संकेत केवल छोटे (शायद अधिक आम) मानों के लिए अक्षमता से भी बदतर है। –
Veedrac
"अक्षमता" के साथ आपका क्या मतलब है? क्या आप पूछ रहे हैं कि स्मृति को कैसे बचाया जाए या कैसे अधिक प्रदर्शन किया जाए? मुझे यह भी लगता है कि यह प्रश्न http://codereview.stackexchange.com/ –
@ker पर है, मुझे लगता है कि मेरा मतलब था; मैं अस्पष्ट था क्योंकि मुझे और अधिक विशिष्ट होने के लिए पर्याप्त जानकारी नहीं थी। हाँ, यह कोडरेव में जा सकता था; मुझे यकीन नहीं था। – phil