Rust 被移动的事物的生命周期
现在我强制Rust 被移动的事物的生命周期,rust,lifetime,Rust,Lifetime,现在我强制'a的生存期为n。我希望它不会编译,因为n的寿命很短,b获取类型b,但是b的寿命大于n 发生了什么事?当某物移动时,一生会发生什么事? 移动表示从一个内存位置到另一个内存位置的数据传输,而不是对内存位置的引用,该内存位置有一个与之相关的生存期。因此,移动的值的生存期与保存该值的变量在作用域内的时间相同,移动该值将导致新值的生存期与保存该值的新变量在作用域内的时间相同 对于第二个示例,如果在内部块之外添加对b的引用,那么将得到预期的编译器错误。编译器足够聪明,知道即使b在上面的范围内定义
'a
的生存期为n
。我希望它不会编译,因为n
的寿命很短,b
获取类型b
,但是b
的寿命大于n
发生了什么事?当某物移动时,一生会发生什么事? 移动表示从一个内存位置到另一个内存位置的数据传输,而不是对内存位置的引用,该内存位置有一个与之相关的生存期。因此,移动的值的生存期与保存该值的变量在作用域内的时间相同,移动该值将导致新值的生存期与保存该值的新变量在作用域内的时间相同
对于第二个示例,如果在内部块之外添加对b的引用,那么将得到预期的编译器错误。编译器足够聪明,知道即使b在上面的范围内定义,它也不会在内部范围之外使用,因此
b
的生存期等于&n
的生存期不是变量。你不能让它们等同于任何东西,也不能扩展它们,也不能缩短它们。它们绝对不能控制事物的寿命
它们只是我们程序员对代码的断言(或者,如果您愿意的话,是“声明”):
fn new(s:&'a u8)->B`和Rust通过编译失败让我们知道了这一点。以我为例,它compiles@Gatonito:啊,对不起,我错过了。这是因为Rust足够聪明,可以注意到b
在n
超出范围后实际上没有被使用,所以它仍然能够证明生存期断言。这是一个叫做“非词汇生命期”的功能。阅读更多
enum ManagedSlice<'a, T: 'a> {
Borrowed(&'a T),
Owned(T)
}
struct B<'a>{
m: ManagedSlice<'a, Vec<u8>>
}
impl<'a> B<'a> {
pub fn new() -> B<'a> {
let m = ManagedSlice::Owned(vec![]);
B{
m: m
}
}
}
fn main() {
let b = B::new();
}
enum ManagedSlice<'a, T: 'a> {
Borrowed(&'a T),
Owned(T)
}
struct B<'a>{
m: ManagedSlice<'a, Vec<u8>>
}
impl<'a> B<'a> {
pub fn new(s: &'a u8) -> B<'a> {
let m = ManagedSlice::Owned(vec![]);
B{
m: m
}
}
}
fn main() {
let b;
{
let n = 0;
b = B::new(&n);
}
}