Rust &引用;借来的价值活得不够长。”;将结构与切片一起使用时

Rust &引用;借来的价值活得不够长。”;将结构与切片一起使用时,rust,borrow-checker,rust-obsolete,Rust,Borrow Checker,Rust Obsolete,编者按:此问题中的代码早于Rust 1.0。从那时起,语义发生了变化,问题中的一些断言不再正确 我有以下代码: extern crate debug; use std::mem::size_of_val; struct A<'a> { a: &'a [i64], } fn main() { // code } 输出是 给了我同样的结果 我试着执行一个类似的println与前面的代码相同 println!("{} - {:?}", size_of_val

编者按:此问题中的代码早于Rust 1.0。从那时起,语义发生了变化,问题中的一些断言不再正确

我有以下代码:

extern crate debug;

use std::mem::size_of_val;

struct A<'a> {
    a: &'a [i64],
}

fn main() {
    // code
}
输出是

给了我同样的结果

我试着执行一个类似的
println与前面的代码相同

println!("{} - {:?}", size_of_val(&x), x);
println!("{} - {:?}", size_of_val(&x), x);
我明白了

我试着执行一个类似的
println与前面的代码相同

println!("{} - {:?}", size_of_val(&x), x);
println!("{} - {:?}", size_of_val(&x), x);
我得到以下生成错误:

我原以为只允许
A{A:&[1,2,3]}
定义,因为
A.A
应该有
&[i64]
类型,但是,显然,锈迹允许我们不包含
&
符号


A{A:&[1,2,3]}
A{A:[1,2,3]}
之间有什么区别?为什么允许我们使用
A{A:[1,2,3]}
(在上面的第二个示例中)?

首先,您可以使用
[T,…n]
,在需要
&[T]
的地方,到切片的转换是隐式的。因此,以下代码完全有效:

let a = [1u, 2, 3];
let b: &[uint] = a;
你的处境纯粹是一生的问题。你的结构是

struct A<'a> {
    a: &'a [i64],
}
这里定义一个数组,并将一个切片存储到结构中的该数组中。然后当到达
,数组超出范围并被销毁,因此
x
中的引用不再有效:编译器禁止该引用

第二种情况:

let x = A { a: [1, 2, 3] };
let x = A { a: &[1, 2, 3] };
这更奇怪。数组存储在匿名变量中。事实上,写作

let foo = &42u;
相当于写作

let _anonymousvariable = 42u;
let foo = &_anonymousvariable;
除了不能直接访问
\u匿名变量

对你来说完全一样,你的代码相当于

let _anonymous_array = [1, 2, 3]
let x = A { a: &_anonymous_array };
因此是完全正确的

最后一个案例:

let x = A { a: [1, 2, 3] };
let x = A { a: &[1, 2, 3] };
当您直接在
println中编写所有内容时!()
。多亏了前面的案例,我们现在才明白为什么会这样:

println!("{} - {:?}", size_of_val(&A { a: &[1, 2, 3] }), A { a: &[1, 2, 3] });
但在这种情况下,也没有问题:

println!("{} - {:?}", size_of_val(&A { a: [1, 2, 3] }), A { a: [1, 2, 3] });
因为数组只在到达
时超出范围,并且在此点之后不存在对它们的引用,因此可以安全地删除它们,并且编译器会很高兴

let _anonymousvariable = 42u;
let foo = &_anonymousvariable;
let _anonymous_array = [1, 2, 3]
let x = A { a: &_anonymous_array };
println!("{} - {:?}", size_of_val(&A { a: &[1, 2, 3] }), A { a: &[1, 2, 3] });
println!("{} - {:?}", size_of_val(&A { a: [1, 2, 3] }), A { a: [1, 2, 3] });