Rust 如何替换Vec中的选项?

Rust 如何替换Vec中的选项?,rust,lifetime,Rust,Lifetime,这是代码(我也把它放在这里的游戏笔里:): 使用std::mem; pub结构树{ 儿童:Vec, //其他领域 } impl树{ pub-fn-mutate(&mut-self,x:i64){ 如果self.is_base_case(){ //基本情况 未执行!(); }否则{ //递归案例 让idx:usize=未实现!(); 让mut子树:Option=self.children.get_mut(idx).expect(“子idx超出界限”).as_mut(); 匹配子树{ Some(re

这是代码(我也把它放在这里的游戏笔里:):

使用std::mem;
pub结构树{
儿童:Vec,
//其他领域
}
impl树{
pub-fn-mutate(&mut-self,x:i64){
如果self.is_base_case(){
//基本情况
未执行!();
}否则{
//递归案例
让idx:usize=未实现!();
让mut子树:Option=self.children.get_mut(idx).expect(“子idx超出界限”).as_mut();
匹配子树{
Some(ref mut subtree)=>未实现!(),
无=>{
让mut new_tree=tree::new();
//在这里的新树上递归
mem::replace(&mut子树,Some(&mut-Box::new(new_-tree));
},
}
}
}
pub fn new()->树{
未执行!();
}
fn是基本情况(&self)->bool{
未执行!();
}
}
fn main(){
println!(“它已编译!”);
}
我正在写一个数据结构,它是树的一种类型。它将子树存储在一个
Vec
中,因为不能保证每个位置都有子树。我正在尝试编写一个方法来变异树,如果它不存在,可能会创建一个子树


正如您所看到的,如果您尝试在playpen中运行代码,我的方法就行不通了。我不确定错误消息告诉了我什么-我最好的猜测是,它希望新创建的子树与第14行创建的子树具有相同的生存期,以便安全地进行替换。然而,我不知道如何让它拥有那一生。这也让我想到:既然新的子树也需要在数据结构的整个生命周期内都有效,那么它不应该与父树具有相同的生命周期吗?但是它可能需要更短一些,因为还有其他方法可以删除子树(我使用了
Option::take
,效果很好-我查看了文档中与之相反的方法,但没有找到)。我的方法有缺陷吗?如果没有,我应该如何修复我的实现?

您试图将
&mut
放在比
&mut
指向的东西寿命更长的结构中。下面是一个简化的示例:

use std::mem;

pub struct Tree {
    children: Vec<Option<Box<Tree>>>,
}

impl Tree {
    pub fn mutate(&mut self, x: i64) {
        let idx: usize = unimplemented!();
        let mut subtree: Option<&mut Box<Tree>> =
            self.children.get_mut(idx).unwrap().as_mut();

        let mut new_tree = Tree::new();
        mem::replace(&mut subtree, Some(&mut Box::new(new_tree)));
    }

    pub fn new() -> Tree {
        unimplemented!();
    }
}

fn main() {}

您试图将
&mut
放在某个结构中,该结构的寿命比
&mut
所指向的东西要长。下面是一个简化的示例:

use std::mem;

pub struct Tree {
    children: Vec<Option<Box<Tree>>>,
}

impl Tree {
    pub fn mutate(&mut self, x: i64) {
        let idx: usize = unimplemented!();
        let mut subtree: Option<&mut Box<Tree>> =
            self.children.get_mut(idx).unwrap().as_mut();

        let mut new_tree = Tree::new();
        mem::replace(&mut subtree, Some(&mut Box::new(new_tree)));
    }

    pub fn new() -> Tree {
        unimplemented!();
    }
}

fn main() {}

您只是到处使用了太多的引用;)摆脱它们,按价值行事,你就没事了:@ker这不会妨碍
mem::replace
完成它的工作吗?@ker哇,我真的想得太多了。你能回答这个问题吗?@ker事实上,如果树已经存在的话,那会有一个副作用,不是吗?我不明白你为什么需要
mem::replace
。如果忽略
replace
的结果,还不如简单地分配…您只是到处使用了太多引用;)摆脱它们,按价值行事,你就没事了:@ker这不会妨碍
mem::replace
完成它的工作吗?@ker哇,我真的想得太多了。你能回答这个问题吗?@ker事实上,如果树已经存在的话,那会有一个副作用,不是吗?我不明白你为什么需要
mem::replace
。如果忽略
replace
的结果,还不如简单地分配。。。
let mut subtree: &mut Option<Box<Tree>> =
    self.children.get_mut(idx).unwrap();

let mut new_tree = Tree::new();
mem::replace(subtree, Some(Box::new(new_tree)));