В чем разница между передачей значения функции по ссылке и ее передачей по полю:
fn main() {
let mut stack_a = 3;
let mut heap_a = Box::new(3);
foo(&mut stack_a);
println!("{}", stack_a);
let r = foo2(&mut stack_a);
// compile error if the next line is uncommented
// println!("{}", stack_a);
bar(heap_a);
// compile error if the next line is uncommented
// println!("{}", heap_a);
}
fn foo(x: &mut i32) {
*x = 5;
}
fn foo2(x: &mut i32) -> &mut i32 {
*x = 5;
x
}
fn bar(mut x: Box<i32>) {
*x = 5;
}
Почему heap_a перемещается в эту функцию, но stack_a is not (stack_a по-прежнему доступен в инструкции println! после вызова foo())?
Ошибка при раскомментировании второй строки:
error[E0382]: use of moved value: `heap_a`
--> <anon>:14:20
|
12 | bar(heap_a);
| ------ value moved here
13 | // compile error if the next line is uncommented
14 | println!("{}", heap_a);
| ^^^^^^ value used here after move
|
= note: move occurs because `heap_a` has type `std::boxed::Box<i32>`, which does not implement the `Copy` trait
Я предполагаю, что это как-то зависит от времени жизни, потому что в случае foo2, stack_a также перемещается в функцию. Если мое предположение верно, то в случае foo, stack_a также переходит к функции, но rustc находит, что его время жизни заканчивается в конце foo и позволяет использовать stack_a после окончания foo. Тогда почему срок жизни heap_a не заканчивается в конце bar?