此代码立即完成(操场):
use std::sync::Mutex;
fn f(_: usize, _: usize) {}
fn main() {
let m = Mutex::new(0);
let i = { *m.lock().unwrap() };
let j = { *m.lock().unwrap() };
f(i, j);
}
此代码也立即完成(操场):
use std::sync::Mutex;
fn f(_: usize, _: usize) {}
fn main() {
let m = Mutex::new(0);
f(
{
let i = *m.lock().unwrap();
i
},
{
let j = *m.lock().unwrap();
j
},
);
}
我觉得这段代码在语义上与上面的代码相同,都是永久阻塞(playground):
use std::sync::Mutex;
fn f(_: usize, _: usize) {}
fn main() {
let m = Mutex::new(0);
f({ *m.lock().unwrap() }, { *m.lock().unwrap() });
}
为什么?
这是由于临时范围造成的。
在第三个例子中,适用于临时匹配保护的最小范围是包含对的调用的整个语句
f
。 (请注意,块中的最后一个表达式不是语句。)因此,您的第二个和第三个代码示例在语义上并不相同。在第三个示例中,在块表达式中创建的互斥保护的生存期扩展到调用的整个语句
f
,但在第二个示例中,互斥保护的生存期仅限于let
相应块表达式内的语句。