这是Rust quiz 28中的一个问题:
struct Guard;
impl Drop for Guard {
fn drop(&mut self) {
print!("1");
}
}
fn main() {
let _guard = Guard;
print!("3");
let _ = Guard;
print!("2");
}
这样的代码在main的第三行打印3121
,赋值给_
意味着立即删除。但是,当使用以下代码将所有权转移到_
时
struct Guard;
impl Drop for Guard {
fn drop(&mut self) {
print!("1");
}
}
fn main() {
let _guard = Guard;
print!("3");
let _ = _guard;
print!("2");
}
它打印321
,这意味着Guard
没有立即下降,而_
拥有Guard
?
所以我不确定当像这样的let _ = Mutex::lock().unwrap()
分配一个互斥锁给_
时,它会立即丢弃互斥锁吗?
1条答案
按热度按时间3phpmpom1#
_
表示“不绑定此值”。当您在现场创建一个新值时,这意味着该值会立即删除,正如您所说的,因为没有绑定来拥有它。当你将它与已经绑定到变量的东西一起使用时,值不会移动,这意味着变量保留所有权。所以这个代码是有效的。
这也行得通。
这在match语句中更有用,当您希望在匹配后使用原始值时,如果内部值被移动,这通常不起作用。
如果将第二个分支改为
Err(_e)
,则得到use of partially moved value:
res``。