Vector 何时以及如何使用引用向量
这段代码编译正确。它有一些未使用的代码警告,但现在还可以Vector 何时以及如何使用引用向量,vector,reference,rust,Vector,Reference,Rust,这段代码编译正确。它有一些未使用的代码警告,但现在还可以 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> { name
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());
}
使用std::collections::BTreeMap;
枚举对象{
名称:BTreeMap>,
堆栈:Vec状态>
我正在尝试制作一个基于堆栈的虚拟机。
我想将状态传递给函数,函数可以从堆栈中取出一些内容,操作这些内容,然后将一些内容放回堆栈中;命名字段将保存命名对象
enum Object {
Str(String),
Int(i32),
Float(f32),
Vector(Vec<Object>),
Prim(fn(State) -> State)
}
我有一种预感,最好将堆栈表示为Vec>
。
按照我现在的方式,我担心我犯了一些效率低下的错误。我的直觉正确吗
问题的第二部分是,我不知道如何让引用向量版本工作。创建具有正确生命周期的新值以推送到堆栈上对我来说不起作用
我对这个问题有点含糊不清,所以如果我不清楚,请向我提问以澄清问题。您无法让它工作的原因是结构不能有引用其他字段的字段。(请参阅底部的支持链接。) 您可以做的是将所有
对象
放入Vec
,并让HashMap
包含它引用的命名元素的索引
struct State {
named: BTreeMap<String, usize>,
stack: Vec<Object>
}
struct状态{
名称:BTreeMap,
堆栈:Vec
}
我还将从您的示例中删除所有生命周期,因为这完全可以通过拥有的对象完成
enum Object {
Str(String),
Int(i32),
Float(f32),
Vector(Vec<Object>),
Prim(fn(State) -> State)
}
enum对象{
Str(字符串),
Int(i32),
浮动(f32),
向量(Vec),
Prim(fn(状态)->状态)
}
您可以在
支持链接:
vec“低效”是什么意思?你是在问如何节省内存还是如何提高性能?我想这个问题属于@ker,我想我是指两者;我含糊不清,因为我不知道如何更具体。是的,它可以转到codereview;我不确定。关于(是的,每个单词都是一个不同的链接)”。指向其他堆栈溢出问题的链接的项目符号列表更易于浏览,因为这样会自动查找标题并显示它们。