如何将&amp; Vector <mutex>转换为Vector <mutex>

时间:2015-07-24 14:17:07

标签: rust

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

transition.abort()

将此修改为矢量的最佳方法是什么?这有效:

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

哪个有意义。但是我该怎么做如果我想传递对Table的引用而不想在Table结构中存储引用?

1 个答案:

答案 0 :(得分:8)

错误信息实际上解释了很多。当您在to_vec上致电&Vec<_>时,您必须制作整个矢量的克隆。这是因为Vec拥有数据,而参考则没有。为了克隆载体,您还必须克隆所有内容。这是因为向量拥有其中的所有项目。

但是,您的向量包含Mutex,无法克隆。互斥锁代表对某些数据的唯一访问,因此将两个独立的互斥锁放到同一数据上将毫无意义。

相反,您可能希望共享对互斥锁的引用,而不是完全克隆它。有可能,你需要一个Arc

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

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