分配给下划线模式时会发生什么?

dpr*_*dpr 28 ownership rust

这是 Rust 测验 28 中的一个问题:

struct Guard;

impl Drop for Guard {
    fn drop(&mut self) {
        print!("1");
    }
}

fn main() {
    let _guard = Guard;
    print!("3");
    let _ = Guard;
    print!("2");
}
Run Code Online (Sandbox Code Playgroud)

这样的代码3121在 main 的第三行中打印 ,分配给_意味着立即删除。但是,当转移所有权时_使用以下代码

struct Guard;

impl Drop for Guard {
    fn drop(&mut self) {
        print!("1");
    }
}

fn main() {
    let _guard = Guard;
    print!("3");
    let _ = _guard;
    print!("2");
}
Run Code Online (Sandbox Code Playgroud)

它打印321,这意味着Guard没有立即删除,并且_拥有Guard?

所以我不确定当_像这样分配互斥体时let _ = Mutex::lock().unwrap(),它会立即删除互斥体吗?

dre*_*ato 39

_意思是“不绑定这个值”。当您当场创建一个新值时,这意味着该值会立即被删除,就像您所说的那样,因为没有绑定来拥有它。

当您将它与已绑定到变量的内容一起使用时,该值不会移动,这意味着该变量保留所有权。所以这段代码有效。

let guard = Guard;
let _ = guard;
let _a = guard; // `guard` still has ownership
Run Code Online (Sandbox Code Playgroud)

这也有效。

let two = (Guard, Guard);
print!("4");
let (_a, _) = two;
print!("3");
let (_, _b) = two;
print!("2");
Run Code Online (Sandbox Code Playgroud)

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

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

如果你把第二个分支改为Err(_e),你就得到了use of partially moved value: `res`