编者注:这个问题中的代码早于 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
字段是使用对切片的引用(即 using )初始化的&
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] }
允许定义,因为A.a
应该有&[i64]
类型,但显然,Rust 允许我们不包含&
符号。
A { a: &[1, 2, 3] }
和 和有什么不一样A { a: [1, 2, 3] }
?为什么我们允许使用A { a: [1, 2, 3] }
(在上面的第二个示例中)?