gpt4 book ai didi

rust - RefCell::borrow 是否移动内容?

转载 作者:行者123 更新时间:2023-11-29 08:23:05 26 4
gpt4 key购买 nike

我有一个链表类型的结构,使用 Option、Rc 和 RefCell。

我想为它实现 fmt::Debug,但遇到了可爱的“无法移出借用的内容”错误。

use std::fmt;
use std::rc::{Rc, Weak};
use std::cell::RefCell;

#[derive(Clone, Debug, Ord, Eq, PartialOrd, PartialEq)]
struct NodeId {id: String}

impl NodeId {
pub fn new(s: &str) -> NodeId { NodeId{id: s.to_string()}}
}

struct NodeInfo {
nodeid: NodeId,
prev: Option<Rc<RefCell<NodeInfo>>>,
next: Option<Rc<RefCell<NodeInfo>>>,
}

impl fmt::Debug for NodeInfo {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "NodeInfo( {} {} {} )", self.nodeid.id,
match self.prev { None => "none".to_string(), Some(ref n) => n.borrow().nodeid.id},
match self.next { None => "none".to_string(), Some(ref n) => "some".to_string()},
)
}
}

fn main() {}

理想情况下,调试输出能够显示 .next 和 .previous 节点的 ID。但是 Rust 不允许访问它们。尝试 .borrow() RefCell 的内容会导致错误,但我不明白为什么。

在这里玩:http://is.gd/Sah7sT

最佳答案

Does RefCell::borrow() move the contents?

没有。叫它借来让它移动是相当卑鄙的! ^_^

问题是您正试图将 id 移出您借用的结构。这是一个移动,因为 String 不是 Copy :

n.borrow().nodeid.id

相反,使用clone 将当前字符串保留在原处,并返回一个全新的字符串:

n.borrow().nodeid.id.clone()

关于rust - RefCell::borrow 是否移动内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28378295/

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