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();
}