我想在使用Mutex时通过'if let'语句创建一个小的作用域,以便能够尽快解锁它.但我在编译时收到了"无可辩驳的if let模式"的警告.有没有更合适的方式写呢?

use std::sync::Mutex;

fn main()
{
    let sources = Mutex::new(vec![1,2,3]);
    // this get warning: irrefutable `if let` pattern
    if let mut vec = sources.lock().unwrap() {
        vec.push(4);
    };

    // No deadlock will occur here
    let mut vec = sources.lock().unwrap();
    vec.push(5);

    // deadlock will occur here, so I'd like the mutex guard dropped as quickly as possible.
    let mut vec2 = sources.lock().unwrap();
    vec2.push(6);
}

推荐答案

使用普通块:

{
    let mut vec = sources.lock().unwrap();
    vec.push(4);
}

或者,如果你不需要这个变量(为了可读性或其他目的),你可以利用drop scope的互斥保护临时:

sources.lock().unwrap().push(4);

Rust相关问答推荐

为什么BitVec缺少Serialize trait?

异步FN中的 rust 递归

铁 rust 中的共享对象实现特征

无法从流中读取Redis请求

S,一般性状和联想型性状有什么不同?

如何在递归数据 struct 中移动所有权时变异引用?

我们能确定Rust会优化掉Clone()吗?如果它会立即掉落?

为什么不';t(&;mut-iter).take(n)取得iter的所有权?

使用 select 处理 SIGINT 和子等待!无阻塞

在没有任何同步的情况下以非原子方式更新由宽松原子操作 Select 的值是否安全?

Rust 中指向自身的引用如何工作?

全面的 Rust Ch.16.2 - 使用捕获和 const 表达式的 struct 模式匹配

RAII 模式的 Rust 解决方案,用于在 new() 和 drop() 上修改另一个对象

仅当满足外部条件时如何添加到 actix web 的路由

Rustlings 切片原语

Rust HRTB 是相同的,但编译器说一种类型比另一种更通用

我可以在不调用 .clone() 的情况下在类型转换期间重用 struct 字段吗?

C++ 中的 CRTP 是一种表达其他语言中特征和/或 ADT 的方法吗?

在 Rust 中组合特征的不同方法是否等效?

有什么办法可以用 Rust 访问 Windows 最近的文件夹吗?