为什么 Rust 中 Arc<Mutex> 有锁方法,但 Arc<i32> 没有?

Fin*_*ber 0 rust

只是玩弄 Arc 和 Mutex,我发现该join方法仅显示在类型值上Arc<Mutex<i32>>,而不是Arc<i32>直接使用时显示。

    let counter = Arc::new(Mutex::new(0));
    counter.lock() // method exists and returns LockResult<MutexGuard<'_, T>>

    // but
    let counter = Arc::new(0);
    counter.lock() // method does not exist

Run Code Online (Sandbox Code Playgroud)

我本以为lock是给定第一个示例的方法Arc,但似乎该方法仅在Arc包装 a时出现Mutex

什么类型的机器允许这种情况发生?

lin*_*kmr 6

lock()方法属于Mutex. 然而,它Arc是一个智能指针类型。由于 Rust 的deref 强制,它会自动将智能指针类型(此处Arc)上不存在的方法“转发”到基础类型(此处Mutex)。

我建议阅读《Rust Book》中的“使用 Deref Trait 将智能指针视为常规引用”一章。