如何转换&Vector <Mutex>到Vector <Mutex>

rog*_*rgl 3 rust

我正在通过Rust示例工作.有这段代码:

fn new(name: &str, left: usize, right: usize) -> Philosopher {
    Philosopher {
        name: name.to_string(),
        left: left,
        right: right,
    }
}
Run Code Online (Sandbox Code Playgroud)

什么是适应矢量的最佳方法?这有效:

 fn new(v: Vec<Mutex<()>>) -> Table {
    Table {
       forks: v
    }
 }
Run Code Online (Sandbox Code Playgroud)

比我尝试了以下:

fn new(v: &Vec<Mutex<()>>) -> Table {
     Table {
         forks: v.to_vec()
     }
 }
Run Code Online (Sandbox Code Playgroud)

但这给了我:

the trait `core::clone::Clone` is not implemented 
for the type    `std::sync::mutex::Mutex<()>` 
Run Code Online (Sandbox Code Playgroud)

这是有道理的.但是我该怎么做如果我想传递对Table的引用而不想在Table结构中存储引用?

She*_*ter 8

错误信息实际上解释了很多.当你打电话to_vec给a时&Vec<_>,你必须克隆整个矢量.那是因为Vec拥有数据,而引用却没有.为了克隆载体,您还必须克隆所有内容.这是因为向量拥有它内部的所有项目.

但是,您的向量包含a Mutex,无法克隆.互斥锁表示对某些数据的唯一访问,因此对同一数据使用两个单独的互斥锁将毫无意义.

相反,您可能希望共享对互斥锁的引用,而不是完全克隆它.机会是,你想要一个Arc:

use std::sync::{Arc, Mutex};

fn main() {
    let things = vec![Arc::new(Mutex::new(()))];
    things.to_vec();
}
Run Code Online (Sandbox Code Playgroud)