Ein einfaches Beispiel:Woher weiß der Rust-Compiler, ob ein Wert verschoben wurde oder nicht?
struct A;
fn main() {
test(2);
test(1);
}
fn test(i: i32) {
println!("test");
let a = A;
if i == 2 {
us(a);
}
println!("end");
}
impl Drop for A {
fn drop(&mut self) {
println!("drop");
}
}
#[allow(unused_variables)]
fn us(a: A){
println!("use");
}
Wenn ich es laufen, der Ausgang ist:
test
use
drop
end
test
end
drop
ich im test(2)
Fall verstehen, a
bei us(a)
bewegt wird, so dass eine Ausgabe es ist „Test-Einsatz -Drop-Ende ".
In der test(1)
ist die Ausgabe jedoch "test-end-drop", was bedeutet, dass der Compiler weiß, dass a
nicht verschoben wurde.
Wenn us(a)
aufgerufen wird, wird es nicht notwendig sein a
in test(i)
fallen zu lassen, wird es in us(a)
fallen gelassen werden; und wenn us(a)
nicht aufgerufen wird, muss a
nach println!("end")
fallen gelassen werden.
Da der Compiler nicht wissen kann, ob us(a)
aufgerufen wird oder nicht, wie kann der Compiler wissen, ob a.drop()
nach println!("end")
aufgerufen werden soll oder nicht?