Rust 如何转换&;向量<;互斥锁>;到向量<;互斥锁>;
我正在用我自己的方法研究锈迹的例子。有一段代码:Rust 如何转换&;向量<;互斥锁>;到向量<;互斥锁>;,rust,Rust,我正在用我自己的方法研究锈迹的例子。有一段代码: fn new(name: &str, left: usize, right: usize) -> Philosopher { Philosopher { name: name.to_string(), left: left, right: right, } } 使其适应向量的最佳方法是什么?这项工作: fn new(v: Vec<Mutex<()>
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新(v:Vec)->表格{
桌子{
叉子:v
}
}
然后我尝试了以下方法:
fn new(v: &Vec<Mutex<()>>) -> Table {
Table {
forks: v.to_vec()
}
}
fn新建(v:&Vec)->表格{
桌子{
叉子:v.to_vec()
}
}
但这给了我:
the trait `core::clone::Clone` is not implemented
for the type `std::sync::mutex::Mutex<()>`
trait`core::clone::clone`未实现
对于'std::sync::mutex::mutex'类型
这是有道理的。但是,如果我想将引用传递给表,而不想在表结构中存储引用,我必须做什么呢?这里的错误消息实际上解释了很多。在
&vec
上调用到_-vec
时,必须克隆整个向量。这是因为Vec
拥有数据,而引用不拥有数据。要克隆向量,还必须克隆所有内容。这是因为向量拥有其中的所有项
但是,向量包含无法克隆的互斥体。互斥表示对某些数据的唯一访问,因此对同一数据使用两个单独的互斥是没有意义的
相反,您可能希望共享对互斥体的引用,而不是完全克隆它。很可能,你想要一个:
use std::sync::{Arc, Mutex};
fn main() {
let things = vec![Arc::new(Mutex::new(()))];
things.to_vec();
}