rust 当赋值给下划线模式时会发生什么?

wixjitnu  于 2023-05-29  发布在  其他
关注(0)|答案(1)|浏览(220)

这是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()分配一个互斥锁给_时,它会立即丢弃互斥锁吗?

3phpmpom

3phpmpom1#

_表示“不绑定此值”。当您在现场创建一个新值时,这意味着该值会立即删除,正如您所说的,因为没有绑定来拥有它。
当你将它与已经绑定到变量的东西一起使用时,值不会移动,这意味着变量保留所有权。所以这个代码是有效的。

let guard = Guard;
let _ = guard;
let _a = guard; // `guard` still has ownership

这也行得通。

let two = (Guard, Guard);
print!("4");
let (_a, _) = two;
print!("3");
let (_, _b) = two;
print!("2");

这在match语句中更有用,当您希望在匹配后使用原始值时,如果内部值被移动,这通常不起作用。

let res: Result<Guard, Guard> = Ok(Guard);
match res {
    Ok(ok) => drop(ok),
    Err(_) => drop(res), // do something with the whole `Result`
}

如果将第二个分支改为Err(_e),则得到use of partially moved value:res``。

相关问题