我正在通过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结构中存储引用?
答案 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();
}