- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个类似循环图的结构,其中节点引用其他节点。为了简洁起见,我删除了一些内容。我刚开始学习 Rust,我用过 Rust borrowed pointers and lifetimes和 https://github.com/nrc/r4cppp/blob/master/graphs/src/rc_graph.rs作为引用
use std::cell::RefCell;
use std::rc::*;
fn main() {
let node1 = Node::new(1);
let node0 = Node::new(0);
node0.borrow_mut().parent = Some(node1.clone());
node1.borrow_mut().parent = Some(node0.clone());
//works
println!("Value of node0: {}", node0.borrow().value);
//neither of the following work
println!("Value of node0.parent: {}", node0.borrow().parent.as_ref().unwrap().borrow().value);
println!("Value of node0: {}", node0.borrow().get_parent().borrow().value);
}
struct Node {
value: i32,
parent: Option<Rc<RefCell<Node>>>
}
impl Node{
fn new(val: i32) -> Rc<RefCell<Node>> {
Rc::new(RefCell::new(Node {
value: val,
parent: None
}))
}
fn get_parent(&self) -> Rc<RefCell<Node>> {
self.parent.as_ref().unwrap().clone()
}
}
我正在尝试输出节点父节点的值,但出现以下编译错误:
16 | println!("Value of node0.parent: {}", node0.borrow().parent.as_ref().unwrap().borrow().value);
| ^^^^^^^^^^^^^^ does not live long enough
和
17 | println!("Value of node0: {}", node0.borrow().get_parent().borrow().value);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ does not live long enough
我做错了什么?
最佳答案
您需要从 println!
调用中分离出借用:
// Borrow them separately, so their scopes are larger.
let n0_borrowed = node0.borrow();
let n1_borrowed = node1.borrow();
let n0_parent = n0_borrowed.parent.as_ref().unwrap();
let n1_parent = n1_borrowed.parent.as_ref().unwrap();
println!("Value of node0: {}", node0.borrow().value);
println!("Value of node0.parent: {}", n0_parent.borrow().value);
println!("Value of node1: {}",node1.borrow().value);
println!("Value of node1.parent: {}", n1_parent.borrow().value);
Here it is running in the Playground .
从本质上讲,当您将所有调用链接在一起时,借用的引用不会存在足够长的时间。将它们分离出来会增加它们的范围并延长它们的生命周期。
关于rust - 循环引用的生命周期不够长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40274049/
我正在开发一个使用多个 turtle 的滚动游戏。玩家 turtle 根据按键命令在 Y 轴上移动。当危害和好处在 X 轴上移动时,然后循环并改变 Y 轴位置。我尝试定义一个名为 colliding(
我不明白为什么他们不接受这个作为解决方案,他们说这是一个错误的答案:- #include int main(void) { int val=0; printf("Input:- \n
我正在使用基于表单的身份验证。 我有一个注销链接,如下所示: 以及对应的注销方法: public String logout() { FacesContext.getCurren
在 IIS7 应用程序池中有一个设置 Idle-time out 默认是 20 分钟,其中说: Amount of time(in minutes) a worker process will rem
我是一名优秀的程序员,十分优秀!