나는 다음과 같은 코드 조각이 :"빌린 값은 충분히 살지 않는"
extern crate debug;
use std::mem::size_of_val;
struct A<'a> {
a: &'a [i64],
}
fn main() {
// code
}
내가 가진 슬라이스를 정의 할 때 &
(즉 &[1, 2, 3]
을)를 println!
을 다음과 같이
println!("{} - {:?}", size_of_val(&A { a: &[1, 2, 3] }), A { a: &[1, 2, 3] });
출력은
16 - A<'static>{a: &[1i64, 2i64, 3i64]}
D &
println!("{} - {:?}", size_of_val(&A { a: [1, 2, 3] }), A { a: [1, 2, 3] });
않고 슬라이스 일단의 것은 저 동일한 결과
16 - A<'static>{a: &[1i64, 2i64, 3i64]}
제공 처음 a
필드 슬라이스에 대한 참조로 초기화 구조체 A
의 인스턴스를 결합하려고하는 경우 (즉, 변수 x
let x = A { a: &[1, 2, 3] }; // &[1, 2, 3] is a reference to a slice
에) &
를 사용하고 난 인스턴스를 결합하면 나는, 그러나
16 - A<'static>{a: &[1i64, 2i64, 3i64]}
을 얻을
println!("{} - {:?}", size_of_val(&x), x);
이전의 것들과 유사한 println!
를 실행하려고 A
의 a
필드가 슬라이스로 초기화됩니다 (을 사용하는 슬라이스에 대한 참조가 아닙니다). 26,593,210), 내가
println!("{} - {:?}", size_of_val(&x), x);
내가 다음 빌드 오류 얻을 이전의 것들과 유사한
println!
실행하려고하고 변수
x
let x = A { a: [1, 2, 3] };
에 :
/prpath/main.rs:12:20: 12:29 error: borrowed value does not live long enough /prpath/main.rs:12 let x = A { a: [1 ,2, 3] }; ^~~~~~~~~ /prpath/main.rs:11:11: 15:2 note: reference must be valid for the block at 11:10... /prpath/main.rs:11 fn main() { /prpath/main.rs:12 let x = A { a: [1 ,2, 3] }; /prpath/main.rs:13 /prpath/main.rs:14 println!("{} - `{:?}`", size_of_val(&x), x); /prpath/main.rs:15 } /prpath/main.rs:12:5: 12:31 note: ...but borrowed value is only valid for the statement at 12:4; consider using a `let` binding to increase its lifetime /prpath/main.rs:12 let x = A { a: [1 ,2, 3] }; ^~~~~~~~~~~~~~~~~~~~~~~~~~ error: aborting due to previous error
내가 기대되었다 A.a
은 &[i64]
유형을 가져야하므로 A { a: &[1, 2, 3] }
정의 만 허용되었지만, 녹이면 &
기호를 포함 할 수 없습니다.
A { a: &[1, 2, 3] }
과 A { a: [1, 2, 3] }
의 차이점은 무엇입니까? 왜 위의 두 번째 예에서 A { a: [1, 2, 3] }
을 사용할 수 있습니까?