【问题标题】:How to a assign a new value to an Rc in Rust如何在 Rust 中为 Rc 分配一个新值
【发布时间】:2023-01-07 00:25:28
【问题描述】:

我正在构建一个包含节点的数据结构,每个节点可能指向另一个节点。 节点之间的指针是使用Rc实现的,像这样:

struct Node {
    ptr: Rc<Node>
}

我希望能够通过克隆另一个现有的 Rc 来更改节点的指针“ptr”以指向另一个节点。

let a: Rc<Node> = ...;
let b: Node = ...;
let b.ptr = a.clone();

我的问题是,编译器认为我正在尝试设置价值节点的,即更改 b.ptr 的底层共享对象,我真的想替换指针: 减少b.ptr旧值的refcount,增加a的refcount,改变b.ptr指向a。

我怎样才能做到这一点?

【问题讨论】:

  • 不太清楚为什么您认为编译器认为您正在尝试设置节点的值。在您提供的代码中,您实际上只更改了b.ptr
  • let b.ptr = ... 是无效语法

标签: pointers rust rc


【解决方案1】:

我的问题是,编译器认为我正在尝试设置节点的值,即更改 b.ptr 的底层共享对象

考虑到您发布的代码,这不太可能,而且代码不完整、单独损坏且没有错误消息,因此很难诊断。即使是 Shepmaster 也尚未获得让他知道未提供的信息的精神力量。

修复明显丢失或不正确的我得到类似的东西:

use std::rc::Rc;
struct Node {
    ptr: Option<Rc<Node>>,
}
fn main() {
    let a = Rc::new(Node { ptr: None });
    let b = Node { ptr: None };
    b.ptr = a.clone().into();
}

并且错误消息是完全清楚的:

error[E0594]: cannot assign to `b.ptr`, as `b` is not declared as mutable
 --> src/main.rs:8:5
  |
7 |     let b = Node { ptr: None };
  |         - help: consider changing this to be mutable: `mut b`
8 |     b.ptr = a.clone().into();
  |     ^^^^^ cannot assign

这可以通过简单地将 b 声明为编译器建议的可变来解决[0]:

use std::rc::Rc;
struct Node {
    ptr: Option<Rc<Node>>,
}
fn main() {
    let a = Rc::new(Node { ptr: None });
    let mut b = Node { ptr: None };
    b.ptr = a.clone().into();
}

[0]:并不是说它总是对的,远非如此,但在这种情况下它的建议是可以的。

【讨论】:

    猜你喜欢
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    相关资源
    最近更新 更多