首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将&Vector<Mutex>转换为Vector<Mutex>

如何将&Vector<Mutex>转换为Vector<Mutex>
EN

Stack Overflow用户
提问于 2015-07-24 14:17:06
回答 1查看 388关注 0票数 3

我在用锈蚀的例子。有一段代码:

代码语言:javascript
复制
fn new(name: &str, left: usize, right: usize) -> Philosopher {
    Philosopher {
        name: name.to_string(),
        left: left,
        right: right,
    }
}

什么是使之适应向量的最佳方法?这样做是可行的:

代码语言:javascript
复制
 fn new(v: Vec<Mutex<()>>) -> Table {
    Table {
       forks: v
    }
 }

比我试过的更好:

代码语言:javascript
复制
fn new(v: &Vec<Mutex<()>>) -> Table {
     Table {
         forks: v.to_vec()
     }
 }

但这给了我:

代码语言:javascript
复制
the trait `core::clone::Clone` is not implemented 
for the type    `std::sync::mutex::Mutex<()>` 

这很有道理。但是,如果我想将引用传递给Table,而不想将引用存储在表结构中,那么我必须做什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-24 15:13:48

错误信息实际上在这里解释了很多。当在to_vec上调用&Vec<_>时,必须对整个向量进行克隆。这是因为Vec拥有数据,而引用不拥有。为了克隆一个向量,还必须克隆所有的内容。这是因为向量拥有它里面的所有项目。

但是,您的载体包含一个无法克隆的Mutex。互斥表示对某些数据的唯一访问,因此对同一数据有两个单独的互斥是没有意义的。

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

代码语言:javascript
复制
use std::sync::{Arc, Mutex};

fn main() {
    let things = vec![Arc::new(Mutex::new(()))];
    things.to_vec();
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31612895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档