不同 Rust 容器之间的共享对象引用无需复制

Shared object reference between different Rust containers without copy

我想为具有相同引用(指针)的同一对象创建多个数据容器,但不知道如何在 Rust 中实现。 Go 可以简单地使用对对象的引用,如下所示:

type container struct {
    id     int
    status string
}

m1 := make(map[int]*container)
m2 := make(map[int]*container)

c := &container{id: 1, status: "test"}
m1[1] = c
m2[1] = c

c.status = "changed"

fmt.Println(m1[1]) // &{1 changed}
fmt.Println(m2[1]) // &{1 changed}

我尝试使用 Box 在堆中分配它但无法编译...

use std::{cell::Cell, collections::HashMap};

fn main() {
    let mut m1: HashMap<i32, Box<Container>> = HashMap::new();
    let mut m2: HashMap<i32, Box<Container>> = HashMap::new();

    let mut c = Box::new(Container {
        id: 1,
        status: Cell::new(String::from("test")),
    });
    m1.insert(1, c);
    m2.insert(1, c);
    c.status.set("changed".to_string());
}

struct Container {
    id: i32,
    status: Cell<String>,
}

我使用 Cell 来允许内部可变性但与这个问题无关...我想学习如何一次创建这个 Container 对象,并在堆上分配它,并共享跨不同数据容器的对象。

而不是 Box,您需要根据同步需要使用 Rc or Arc

use std::rc::Rc;
use std::{cell::Cell, collections::HashMap};

fn main() {
    let mut m1: HashMap<i32, Rc<Container>> = HashMap::new();
    let mut m2: HashMap<i32, Rc<Container>> = HashMap::new();

    let c = Rc::new(Container {
        id: 1,
        status: Cell::new(String::from("test")),
    });
    m1.insert(1, Rc::clone(&c));
    m2.insert(1, Rc::clone(&c));
    c.status.set("changed".to_string());
}

struct Container {
    id: i32,
    status: Cell<String>,
}

Playground