从 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);
    }
}

Playground

.len() 访问有效是因为 deref coercion(因为 MutexGuard 实现了 Deref),但这在检查值是否实现时不适用 IteratorIntoIterator.

您可以手动 deref-and-reborrow 使其工作:

    for item in &*getter {
        println!("{}", item);
    }