gpt4 book ai didi

vector - 何时以及如何使用引用向量

转载 作者:行者123 更新时间:2023-11-29 07:48:09 25 4
gpt4 key购买 nike

这段代码可以正确编译。它有一些未使用的代码警告,但现在没关系。

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_intstack: Vec<Object<'a>> .

我正在尝试制作一个基于堆栈的 VM。我想将状态传递给函数,函数可以从堆栈中取出东西,操作这些东西,然后将一些东西放回堆栈;命名字段将保存命名对象。

我有一种预感,将堆栈表示为 Vec<&'a Object<'a>> 会更好反而。我现在拥有它的方式,我担心我犯了一些效率低下的错误。我的预感是否正确?

问题的第二部分是我不知道如何让引用版本的向量工作。创造具有正确生命周期的新值(value)以推送到堆栈上对我来说不起作用。

我对这个问题有点含糊,所以如果我不清楚,请问我问题以澄清问题。

最佳答案

你无法让它工作的原因是结构不能有引用其他字段的字段。 (请参阅底部的支持链接。)

您可以做的是将所有 Object 放入您的 Vec 中,并让 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 中尝试一个有效的实现

支持链接:

关于vector - 何时以及如何使用引用向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33600606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com