这是 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` 。
| 归档时间: |
|
| 查看次数: |
2383 次 |
| 最近记录: |