gpt4 book ai didi

rust - Rust 中的引用分配

转载 作者:行者123 更新时间:2023-12-05 01:13:01 28 4
gpt4 key购买 nike

以下代码无法编译,因为 x在移动之后使用(因为 x 具有类型 &mut u8 ,它没有实现 Copy 特性)

fn main() {
let mut a: u8 = 1;
let x: &mut u8 = &mut a;
let y = x;
x;
}

据我了解 y隐含类型 &mut u8
但是如果我指定 y 的类型明确地编译。以下代码编译
fn main() {
let mut a: u8 = 1;
let x: &mut u8 = &mut a;
let y: &mut u8 = x;
x;
}

顺便换一下 let y: &mut u8 = x;let y: &u8 = x;它也编译。

在我看来,一切都没有改变, y&mut u8在第一个例子中,它是 &mut u8在第二个中,但前者不编译,后者编译。

为什么?有什么不同?

最佳答案

&mut u8不是一个完整的类型。所有引用类型都必须有一个生命周期参数。当你省略它时,Rust 编译器必须推断它,它会选择最短的生命周期。在您的第一个示例中,脱糖的第一步是(使用 a fake syntax from the Rustonomicon ):

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
let y = x;
x;
}
}

这仍然不完全明确,因为 y 的类型仍然未知。它是什么?好吧,因为它是从 x 分配的,这是一个 &'a mut u8 ,它也应该是 &'a 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;
}
}

嗯,那不好。自 yx 具有相同的生命周期,其创建涉及移动 x 中的引用。和制作 x无效的。该程序因此因尝试使用 x 而被拒绝。 .

将签名添加到 y本质上为编译器提供了一个可以推断生命周期的新位置。之前,正常类型推断 yx 的类型相同,这意味着它持续了 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 ,如 let y: &'b mut u8 = &'b mut *x .

另一个可能的解决方法是明确地说“以不同的生命周期再次借用 *x”:
fn main() {
let mut a: u8 = 1;
let x: &mut u8 = &mut a;
let y = &mut *x;
x;
}

原理和之前一样:说 &更多的时候给编译器更多的地方,它可以在程序中调整生命周期以使一切正常工作。

关于rust - Rust 中的引用分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60020262/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com