Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vector 何时以及如何使用引用向量_Vector_Reference_Rust - Fatal编程技术网

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;我不确定。关于(是的,每个单词都是一个不同的链接)”。指向其他堆栈溢出问题的链接的项目符号列表更易于浏览,因为这样会自动查找标题并显示它们。