【发布时间】:2021-03-30 15:38:22
【问题描述】:
我需要使用 RefCell 实现特定签名的功能。任务是:给定二叉树中特定深度d的节点列表,推导出下一层d+1的节点列表。我有一个草稿解决方案,但由于以下错误而无法编译:
error[E0515]: cannot return value referencing local variable `node`
--> src/lib.rs:31:5
|
26 | if let Some(child) = &node.left {
| ---- `node` is borrowed here
...
31 | new_level
| ^^^^^^^^^ returns a value referencing data owned by the current function
为什么我希望我的代码能够工作:我只对函数 next_level 中的引用进行操作,因此,拥有的引用输入向量将在其执行结束时被删除这一事实应该不是问题 - 我的值指向还活着。我认为 std::cell::Ref 相当于普通的 ref,除了借用规则是在运行时强制执行的。
如果我将输入 vec 从 Vec<Ref<TreeNode>> 更改为 Vec<&TreeNode>,则相同的代码可以工作。为什么?两者有何不同?
完整代码:
use std::cell::{RefCell, Ref};
use std::rc::Rc;
// Definition for a binary tree node.
#[derive(Debug, PartialEq, Eq)]
pub struct TreeNode {
pub val: i32,
pub left: Option<Rc<RefCell<TreeNode>>>,
pub right: Option<Rc<RefCell<TreeNode>>>,
}
fn next_level(lvl: Vec<Ref<TreeNode>>) -> Vec<Ref<TreeNode>> {
let mut new_level = vec![];
for node in lvl {
if let Some(child) = &node.left {
let rf = child.borrow();
new_level.push(rf);
}
}
new_level
}
【问题讨论】:
标签: rust