編集者注: この質問のコードは Rust 1.0 より前のものです。それ以来、セマンティクスが変更され、質問で行われた主張の一部はもはや真実ではありません。
次のコードがあります。
extern crate debug;
use std::mem::size_of_val;
struct A<'a> {
a: &'a [i64],
}
fn main() {
// code
}
&
次のように(ie &[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]}
なしでスライスを定義する&
println!("{} - {:?}", size_of_val(&A { a: [1, 2, 3] }), A { a: [1, 2, 3] });
私に同じ結果を与える
16 - A<'static>{a: &[1i64, 2i64, 3i64]}
最初に struct のインスタンスをバインドしようとするとA
、そのa
フィールドはスライスへの参照で初期化されます (つまり、 を使用&
)、変数にx
let x = A { a: &[1, 2, 3] }; // &[1, 2, 3] is a reference to a slice
println!
そして、前のものと同様のことを実行しようとします
println!("{} - {:?}", size_of_val(&x), x);
私は得る
16 - A<'static>{a: &[1i64, 2i64, 3i64]}
A
ただし、a
フィールドがスライスに初期化されている (を使用したスライスへの参照ではない&
) のインスタンスを変数にバインドすると、x
let x = A { a: [1, 2, 3] };
println!
そして、前のものと同様のことを実行しようとします
println!("{} - {:?}", size_of_val(&x), x);
次のビルド エラーが発生します。
/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: &[1, 2, 3] }
なので定義だけが許可されると思っていましたが、どうやら Rust ではシンボルを含めないように許可されているようです。A.a
&[i64]
&
A { a: &[1, 2, 3] }
とはどう違いA { a: [1, 2, 3] }
ますか?なぜ使用が許可されているA { a: [1, 2, 3] }
のですか (上記の 2 番目の例)。