我正在通过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结构中存储引用?
错误信息实际上解释了很多.当你打电话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)
归档时间: |
|
查看次数: |
272 次 |
最近记录: |