从 Arc Mutex 获取向量
getting vector from an Arc Mutex
所以我有这个代码:
use std::sync::{Arc, Mutex};
fn main() {
let array = vec!("test", "work", "please");
let test = Arc::new(Mutex::new(array));
let getter = test.lock().unwrap();
println!("{:?}", getter);
for item in getter {
println!("{}", item);
}
}
它抛出一个错误说:
error[E0277]: `MutexGuard<'_, Vec<&str>>` is not an iterator
--> src/main.rs:11:17
|
11 | for item in getter {
| ^^^^^^ `MutexGuard<'_, Vec<&str>>` is not an iterator
|
= help: the trait `Iterator` is not implemented for `MutexGuard<'_, Vec<&str>>`
= note: required because of the requirements on the impl of `IntoIterator` for `MutexGuard<'_, Vec<&str>>`
哪个,好吧好吧。但是我能够做到 let getter = test.lock().unwrap().len();
并且可以正确获取长度。那么为什么它在第二种情况下知道它是一个数组而不是第一个呢?
getter
是实现 Deref<Target = Vec<&str>>
的 MutexGuard
。当您在其上调用方法时,如 .len()
,它会自动取消引用到 Vec
,因为 MutexGuard
上没有 .len()
方法。 for
循环不会自动完成同样的操作。您可以强制手动取消引用:
for item in &*getter {
或者您可以调用 .iter()
它会自动取消引用它:
for item in getter.iter() {
代码:
use std::sync::{Arc, Mutex};
fn main() {
let array = vec!["test", "work", "please"];
let test = Arc::new(Mutex::new(array));
let getter = test.lock().unwrap();
println!("{:?}", getter);
for item in &*getter {
println!("{}", item);
}
for item in getter.iter() {
println!("{}", item);
}
}
.len()
访问有效是因为 deref coercion(因为 MutexGuard
实现了 Deref
),但这在检查值是否实现时不适用 Iterator
或 IntoIterator
.
您可以手动 deref-and-reborrow 使其工作:
for item in &*getter {
println!("{}", item);
}
所以我有这个代码:
use std::sync::{Arc, Mutex};
fn main() {
let array = vec!("test", "work", "please");
let test = Arc::new(Mutex::new(array));
let getter = test.lock().unwrap();
println!("{:?}", getter);
for item in getter {
println!("{}", item);
}
}
它抛出一个错误说:
error[E0277]: `MutexGuard<'_, Vec<&str>>` is not an iterator
--> src/main.rs:11:17
|
11 | for item in getter {
| ^^^^^^ `MutexGuard<'_, Vec<&str>>` is not an iterator
|
= help: the trait `Iterator` is not implemented for `MutexGuard<'_, Vec<&str>>`
= note: required because of the requirements on the impl of `IntoIterator` for `MutexGuard<'_, Vec<&str>>`
哪个,好吧好吧。但是我能够做到 let getter = test.lock().unwrap().len();
并且可以正确获取长度。那么为什么它在第二种情况下知道它是一个数组而不是第一个呢?
getter
是实现 Deref<Target = Vec<&str>>
的 MutexGuard
。当您在其上调用方法时,如 .len()
,它会自动取消引用到 Vec
,因为 MutexGuard
上没有 .len()
方法。 for
循环不会自动完成同样的操作。您可以强制手动取消引用:
for item in &*getter {
或者您可以调用 .iter()
它会自动取消引用它:
for item in getter.iter() {
代码:
use std::sync::{Arc, Mutex};
fn main() {
let array = vec!["test", "work", "please"];
let test = Arc::new(Mutex::new(array));
let getter = test.lock().unwrap();
println!("{:?}", getter);
for item in &*getter {
println!("{}", item);
}
for item in getter.iter() {
println!("{}", item);
}
}
.len()
访问有效是因为 deref coercion(因为 MutexGuard
实现了 Deref
),但这在检查值是否实现时不适用 Iterator
或 IntoIterator
.
您可以手动 deref-and-reborrow 使其工作:
for item in &*getter {
println!("{}", item);
}