根据我的理解,在互斥锁上获得锁,然后立即在受保护的 struct 上调用函数,而不为互斥锁声明单独的变量,一旦函数调用完成,就会释放该保护.

我的问题是,在循环声明中获取锁时是否也是这样:

for ele in mtx.lock().await.clone() {
    // do something requiring lock on mtx
}

这里的期望是,一旦clone调用完成,mtx上的锁就会被释放,并且可以在循环中重新获得.是这样吗?如果不是,为什么不是这样?

推荐答案

不,事实并非如此.迭代器表达式中创建的临时变量将一直存在到for循环结束,互斥锁保护只会在循环结束后删除.

临时表通常在语句末尾删除.您可以在documentation on temporary scopes中查看完整规则:

除了生存期扩展之外,表达式的临时作用域是包含该表达式的最小作用域,并且是以下作用域之一:

  • 整个功能体.
  • 一个声明.
  • ifwhileloop表达式的主体.
  • if表达式的else块.
  • ifwhile表达式或match保护的条件表达式.
  • 匹配臂的表达式.
  • 惰性布尔表达式的第二个操作数.

这些规则涵盖了许多微妙的情况,所以很难简单地总结一下为什么语言是这样设计的.特别是对于For循环,如果在迭代器表达式中创建的临时对象会立即被删除,这将非常恼人,因为这样会导致borrow 判断器错误:

for x in my_vec.iter().filter(|&&y| y != 0) {
    ...
}

如果编译器只保留迭代器表达式的result,那么返回my_vec.iter()的迭代器将立即被删除,这当然不是所希望的.

Rust相关问答推荐

在Tauri中获取ICoreWebView 2_7以打印PDF

PyReadonlyArray2到Vec T<>

如何从接收&;self的方法克隆RC

如果LET;使用布尔表达式链接(&Q);

交换引用时的生命周期

我应该将哪些文件放入我的GitHub存储库

如何从ruust中的fig.toml中读取?

如何将单个 struct 实例与插入器一起传递到Rust中的映射

如何迭代属性以判断相等性?

为什么将易错函数的泛型结果作为泛型参数传递 infer ()?不应该是暧昧的吗?

Const 上下文:从 init 函数创建具有 const 通用长度的数组

Rust Option 的空显式泛型参数

将泛型中的 Box 转换为 rust 中的 Box

go 重并堆积MPSC通道消息

在 Rust 中实现资源消耗的安全包装器

为什么在 rust 中删除 vec 之前应该删除元素

更好的方法来模式匹配带有 Rust 的窥视孔装配说明窗口?

将 (T, ()) 转换为 T 安全吗?

为什么 u64::trailing_zeros() 在无分支工作时生成分支程序集?

为什么可以从不可变 struct 的字段中移动?