Rust 遍历BST时借用时丢弃的临时值 使用std:{cell::RefCell,rc::rc}; #[导出(调试、部分q、Eq)] 树状结构酒店{ 发布日期:i32, 左:选项, 酒吧权利:选择权, } fn find_min(多节点:&选项)->i32{ 而node.as_ref().unwrap().borrow().left.is_some(){ node=&node.as_ref().unwrap().borrow().left; } node.as_ref().unwrap().borrow().val } 错误[E0716]:借用时丢弃的临时值 -->src/lib.rs:12:17 | 10 | fn find_min(多节点:&选项)->i32{ |-我们将此引用的生存期称为“1”` 11 | while node.as_ref().unwrap().borrow().left.is_some(){ 12 | node=&node.as_ref().unwrap().borrow().left; |----------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^------临时值在该语句末尾被释放 | | | ||创建仍在使用时释放的临时 |作业要求借用期限为`'1`

Rust 遍历BST时借用时丢弃的临时值 使用std:{cell::RefCell,rc::rc}; #[导出(调试、部分q、Eq)] 树状结构酒店{ 发布日期:i32, 左:选项, 酒吧权利:选择权, } fn find_min(多节点:&选项)->i32{ 而node.as_ref().unwrap().borrow().left.is_some(){ node=&node.as_ref().unwrap().borrow().left; } node.as_ref().unwrap().borrow().val } 错误[E0716]:借用时丢弃的临时值 -->src/lib.rs:12:17 | 10 | fn find_min(多节点:&选项)->i32{ |-我们将此引用的生存期称为“1”` 11 | while node.as_ref().unwrap().borrow().left.is_some(){ 12 | node=&node.as_ref().unwrap().borrow().left; |----------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^------临时值在该语句末尾被释放 | | | ||创建仍在使用时释放的临时 |作业要求借用期限为`'1`,rust,binary-search-tree,Rust,Binary Search Tree,TreeNode已给定,无法更改 我理解为什么会出现错误,但不知道如何修复它。更新: 使用Rc作为参数可能会更好: 使用std::rc::rc; #[导出(调试、部分q、Eq)] 树状结构酒店{ 发布日期:i32, 左:选项, 酒吧权利:选择权, } 发布fn find_min(mut current:Rc)->i32{ 而current.left.is_some(){ current=Rc::clone(current.left.as_ref().unwrap()); } current.va

TreeNode
已给定,无法更改

我理解为什么会出现错误,但不知道如何修复它。

更新:

使用
Rc
作为参数可能会更好:

使用std::rc::rc;
#[导出(调试、部分q、Eq)]
树状结构酒店{
发布日期:i32,
左:选项,
酒吧权利:选择权,
}
发布fn find_min(mut current:Rc)->i32{
而current.left.is_some(){
current=Rc::clone(current.left.as_ref().unwrap());
}
current.val
}
fn main(){
left_child=TreeNode{
瓦尔:1,
左:没有,
右:没有,
};
设root=TreeNode{
瓦尔:6,
左:一些(Rc::new(left_child)),
右:没有,
};
println!(“min:{}”,find_min(Rc::new(root));
}

RefCell
mut
这两个东西对我来说是多余的吗

那么:

使用std::rc::rc;
#[导出(调试、部分q、Eq)]
树状结构酒店{
发布日期:i32,
左:选项,
酒吧权利:选择权,
}
发布fn find_min(根:&TreeNode)->i32{
让mut current=Rc::new(根);
而current.left.is_some(){
current=Rc::new(current.left.as_ref().unwrap());
}
current.val
}
更新:

使用
Rc
作为参数可能会更好:

使用std::rc::rc;
#[导出(调试、部分q、Eq)]
树状结构酒店{
发布日期:i32,
左:选项,
酒吧权利:选择权,
}
发布fn find_min(mut current:Rc)->i32{
而current.left.is_some(){
current=Rc::clone(current.left.as_ref().unwrap());
}
current.val
}
fn main(){
left_child=TreeNode{
瓦尔:1,
左:没有,
右:没有,
};
设root=TreeNode{
瓦尔:6,
左:一些(Rc::new(left_child)),
右:没有,
};
println!(“min:{}”,find_min(Rc::new(root));
}

RefCell
mut
这两个东西对我来说是多余的吗

那么:

使用std::rc::rc;
#[导出(调试、部分q、Eq)]
树状结构酒店{
发布日期:i32,
左:选项,
酒吧权利:选择权,
}
发布fn find_min(根:&TreeNode)->i32{
让mut current=Rc::new(根);
而current.left.is_some(){
current=Rc::new(current.left.as_ref().unwrap());
}
current.val
}

基于以下内容编写了我的解决方案:

fn find_min(节点:&选项)->i32{
让mut curr=node.as_ref().unwrap().clone();
而curr.borrow()left.is_some(){
让tmp=curr.borrow().left.as_ref().unwrap().clone();
curr=tmp;
}
设res=curr.borrow().val;
物件
}

这两个临时变量看起来都不好,但事实就是如此。

基于以下内容编写了我的解决方案:

fn find_min(节点:&选项)->i32{
让mut curr=node.as_ref().unwrap().clone();
而curr.borrow()left.is_some(){
让tmp=curr.borrow().left.as_ref().unwrap().clone();
curr=tmp;
}
设res=curr.borrow().val;
物件
}

这两个临时变量看起来都不好,但实际上都是这样。

感谢您的回答。不幸的是,TreeNode已给出且无法更改。感谢您的回答。不幸的是,TreeNode已给出且无法更改。看起来您的问题可能由;;的答案回答。如果不是,请您的问题解释d差异。否则,我们可以将此问题标记为已回答。感谢您提供的链接。其中一个提供了我问题的答案。我添加了自己的解决方案。您的问题似乎可以通过;;的答案来回答。如果没有,请您的问题解释差异。否则,我们可以将此问题标记为已回答。T谢谢你的链接。其中一个提供了我问题的答案。我添加了自己的解决方案。
use std::{cell::RefCell, rc::Rc};

#[derive(Debug, PartialEq, Eq)]
pub struct TreeNode {
    pub val: i32,
    pub left: Option<Rc<RefCell<TreeNode>>>,
    pub right: Option<Rc<RefCell<TreeNode>>>,
}

fn find_min(mut node: &Option<Rc<RefCell<TreeNode>>>) -> i32 {
    while node.as_ref().unwrap().borrow().left.is_some() {
        node = &node.as_ref().unwrap().borrow().left;
    }
    node.as_ref().unwrap().borrow().val
}
fn find_min(node: &Option<Rc<RefCell<TreeNode>>>) -> i32 {
    let mut curr = node.as_ref().unwrap().clone();
    while curr.borrow().left.is_some() {
        let tmp = curr.borrow().left.as_ref().unwrap().clone();
        curr = tmp;
    }
    let res = curr.borrow().val;
    res
}