只是玩弄 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
什么类型的机器允许这种情况发生?
该lock()方法属于Mutex. 然而,它Arc是一个智能指针类型。由于 Rust 的deref 强制,它会自动将智能指针类型(此处Arc)上不存在的方法“转发”到基础类型(此处Mutex)。
我建议阅读《Rust Book》中的“使用 Deref Trait 将智能指针视为常规引用”一章。