我在用锈蚀的例子。有一段代码:
fn new(name: &str, left: usize, right: usize) -> Philosopher {
Philosopher {
name: name.to_string(),
left: left,
right: right,
}
}什么是使之适应向量的最佳方法?这样做是可行的:
fn new(v: Vec<Mutex<()>>) -> Table {
Table {
forks: v
}
}比我试过的更好:
fn new(v: &Vec<Mutex<()>>) -> Table {
Table {
forks: v.to_vec()
}
}但这给了我:
the trait `core::clone::Clone` is not implemented
for the type `std::sync::mutex::Mutex<()>` 这很有道理。但是,如果我想将引用传递给Table,而不想将引用存储在表结构中,那么我必须做什么?
发布于 2015-07-24 15:13:48
错误信息实际上在这里解释了很多。当在to_vec上调用&Vec<_>时,必须对整个向量进行克隆。这是因为Vec拥有数据,而引用不拥有。为了克隆一个向量,还必须克隆所有的内容。这是因为向量拥有它里面的所有项目。
但是,您的载体包含一个无法克隆的Mutex。互斥表示对某些数据的唯一访问,因此对同一数据有两个单独的互斥是没有意义的。
相反,您可能希望共享对互斥对象的引用,而不是完全克隆它。很可能,你想要一个Arc
use std::sync::{Arc, Mutex};
fn main() {
let things = vec![Arc::new(Mutex::new(()))];
things.to_vec();
}https://stackoverflow.com/questions/31612895
复制相似问题