:값을 함수에 전달하여 참조로 전달하고 Box에서 전달하는 것의 차이점은 무엇입니까? "상자에서"참조로 함수에 값을 전달하고 전달의 차이점은 무엇
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
는 stack_a
가 println!
에서 계속 사용할 수 있습니다 (없는 성명 : foo()
통화 이후)? 두 번째 println!("{}", stack_a);
주석을
오류 :
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
나는이 오류가 수명을 참조하여 설명 될 수 있다고 생각합니다. foo
의 경우 stack_a
(main
함수에 있음) 함수는 foo
함수로 이동되지만 함수 foo
, 의 인수의 수명이 foo
으로 끝나는 것을 컴파일러에서 확인합니다. 따라서 foo
이 반환 된 후 main
함수에서 변수 stack_a
을 사용할 수 있습니다. foo2
의 경우 stack_a
도 함수로 이동하지만이를 반환합니다.
왜 heap_a
의 수명이 bar
끝에서 끝나지 않습니까?