Rust &引用;借来的价值活得不够长。”;将结构与切片一起使用时
编者按:此问题中的代码早于Rust 1.0。从那时起,语义发生了变化,问题中的一些断言不再正确 我有以下代码: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
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] });