我已经阅读了什么是非词法生命周期。使用非词法借用检查器,以下代码可以编译:
fn main() {
let mut scores = vec![1, 2, 3];
let score = &scores[0]; // borrows `scores`, but never used
// its lifetime can end here
scores.push(4); // borrows `scores` mutably, and succeeds
}
这种情况似乎是合理的,但是在互斥锁上,我们不希望它过早释放。
在下面的代码中,我想先锁定共享数据结构,然后执行一个闭包,主要是为了避免死锁。但是,我不确定这个锁是否会过早释放。
use lazy_static::lazy_static; // 1.3.0
use std::sync::Mutex;
struct Something;
lazy_static! {
static ref SHARED: Mutex<Something> = Mutex::new(Something);
}
pub fn lock_and_execute(f: Box<Fn()>) {
let _locked = SHARED.lock(); // `_locked` is never used.
// does its lifetime end here?
f();
}
Rust是否特殊处理锁,以确保它们的生命周期延伸到其作用域的结束?我们必须显式地使用该变量来避免锁的过早释放吗,就像以下代码中那样?
pub fn lock_and_execute(f: Box<Fn()>) {
let locked = SHARED.lock(); // - lifetime begins
f(); // |
drop(locked); // - lifetime ends
}
let
将相同的名称绑定到另一个对象) - Zhiyao