В чем разница между передачей значения функции по ссылке и ее передачей по полю:
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
?