gpt4 book ai didi

rust - 如何将 &Vector 转换为 Vector

转载 作者:行者123 更新时间:2023-11-29 07:56:44 29 4
gpt4 key购买 nike

我正在研究 Rust 示例。有这段代码:

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

但这给了我:

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

这是有道理的。但是,如果我想传递对 Table 的引用并且不想在 Table 结构中存储引用,我该怎么办?

最佳答案

错误信息这里其实说明了很多。当您调用 to_vec&Vec<_> 上,您必须对整个向量进行克隆。那是因为Vec拥有数据,而引用不拥有。为了克隆载体,您还必须克隆所有内容。这是因为向量拥有其中的所有项。

但是,您的矢量包含一个 Mutex ,这是无法克隆的。互斥锁代表对某些数据的唯一访问,因此对同一数据使用两个单独的互斥锁是没有意义的。

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

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

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

关于rust - 如何将 &Vector<Mutex> 转换为 Vector<Mutex>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31612895/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com