gpt4 book ai didi

rust - 从 Arc Mutex 获取向量

转载 作者:行者123 更新时间:2023-12-01 23:00:19 24 4
gpt4 key购买 nike

所以我有这段代码:

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(); 并正确获取长度。那么,为什么它在第二种情况下知道它是一个数组,而在第一种情况下却不知道呢?

最佳答案

getterMutexGuard实现Deref<Target = Vec<&str>> .当你调用一个方法时,比如 .len() , 它会自动取消引用到 Vec因为没有 .len() MutexGuard 上的方法. 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);
}
}

Playground

关于rust - 从 Arc Mutex 获取向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72018622/

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