不同 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>,
}
我想为具有相同引用(指针)的同一对象创建多个数据容器,但不知道如何在 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>,
}