Rust中参考文献的分配
以下代码未编译,因为移动后使用了Rust中参考文献的分配,rust,Rust,以下代码未编译,因为移动后使用了x(因为x具有类型&mut u8,这不实现复制特性) 据我所知,y隐式地具有类型&mut u8 但是如果我明确指定y的类型,它将编译。下面的代码编译 fn main() { let mut a: u8 = 1; let x: &mut u8 = &mut a; let y: &mut u8 = x; x; } 顺便说一下,如果我改变让y:&mut u8=x至设y:&u8=x它也可以编译 在我看来,似乎什么都
x
(因为x
具有类型&mut u8
,这不实现复制
特性)
据我所知,y
隐式地具有类型&mut u8
但是如果我明确指定y
的类型,它将编译。下面的代码编译
fn main() {
let mut a: u8 = 1;
let x: &mut u8 = &mut a;
let y: &mut u8 = x;
x;
}
顺便说一下,如果我改变让y:&mut u8=x代码>至设y:&u8=x代码>它也可以编译
在我看来,似乎什么都没有改变,y
在第一个示例中是&mut u8
,在第二个示例中是&mut u8
,但前者不编译,后者编译
为什么??区别是什么?&mut u8
不是一个完整的类型。所有引用类型都必须具有生存期参数。当您删除它时,Rust编译器必须推断它,它将选择尽可能短的生存期。在第一个示例中,脱胶的第一步是(使用):
这仍然不是完全明确的,因为y
的类型仍然未知。这是怎么一回事?因为它是从x
分配的,这是一个和一个mut u8
,所以它也应该是一个和一个mut u8
。请注意,这并没有遵循寿命省略的“可能的最短寿命”规则。你没有省略一辈子,你省略了整个类型,它是通过类型推断重建的
fn main() {
let mut a: u8 = 1;
'a: {
let x: &'a mut u8 = &'a mut a; // the lifetime of x must last until its use at the end
let y: &'a mut u8 = x;
x;
}
}
那可不行。由于y
与x
具有相同的生存期,因此其创建涉及移动x
中的引用并使x
无效。因此,该程序因试图使用x
而被拒绝
将签名添加到y
本质上为编译器提供了一个新的位置,在那里它可以推断生命周期。以前,正常的类型推断使得y
与x
具有相同的类型,这意味着它持续的时间与x
一样长,并且使得x
不可用。现在,y
不需要具有与x
相同的类型;借用的生命周期可能不同。特别是,它被缩短了
fn main() {
let mut a: u8 = 1;
'a: {
let x: &'a mut u8 = &'a mut a; // the lifetime of x must last until it's use at the end
'b: {
let y: &'b mut u8 = x; // y and x can now have different lifetimes, *x is reborrowed here
}
x; // x not moved from, still valid
}
}
现在,不是将引用x
移动到y
并使其无效,而是将值*x
临时“重新加载”以使y
,如让y:&'b mut u8=&'b mut*x
另一种可能的修复方法是明确地说“借用*x
使用不同的生存期”:
原理和以前一样:更频繁地说&
会给编译器更多的空间,让它可以调整程序中的生命周期,使一切正常工作。“据我所知,y隐式地具有type&mut u8”
我目前没有IDE,但我认为这是错误的,y的类型是&u8
让y:&u8=x代码>也编译我当时错了。你能告诉我错误信息吗?error[E0382]:使用移动值:
x``链接到rust游乐场谢谢你的回答!请您也简单地回答一下,我们这里不是同时有两个对a
的可变引用吗?这也可以用生命周期来解释吗?所以我们有一个借贷者x
,然后只有一个借贷者y
,然后又是x
?我不认为这是由生命周期解释的,不。借贷者检查器跟踪a
是由x
借来的,然后是由y
,然后是由x
借来的,但我不相信这真的被写进了人生。不过我不确定。
fn main() {
let mut a: u8 = 1;
'a: {
let x: &'a mut u8 = &'a mut a; // the lifetime of x must last until its use at the end
let y: &'a mut u8 = x;
x;
}
}
fn main() {
let mut a: u8 = 1;
'a: {
let x: &'a mut u8 = &'a mut a; // the lifetime of x must last until it's use at the end
'b: {
let y: &'b mut u8 = x; // y and x can now have different lifetimes, *x is reborrowed here
}
x; // x not moved from, still valid
}
}
fn main() {
let mut a: u8 = 1;
let x: &mut u8 = &mut a;
let y = &mut *x;
x;
}