gpt4 book ai didi

rust - 了解 Rust 中参数化结构的生命周期

转载 作者:行者123 更新时间:2023-11-29 08:04:57 25 4
gpt4 key购买 nike

下面的代码

struct Cat<'a, T> {
coolness: &'a T,
}

提示说

error[E0309]: the parameter type `T` may not live long enough
--> src/main.rs:2:5
|
1 | struct Cat<'a, T> {
| - help: consider adding an explicit lifetime bound `T: 'a`...
2 | coolness: &'a T,
| ^^^^^^^^^^^^^^^
|
note: ...so that the reference type `&'a T` does not outlive the data it points at
--> src/main.rs:2:5
|
2 | coolness: &'a T,
| ^^^^^^^^^^^^^^^

有了明确的生命周期限制,它就可以编译。当我实例化 T 是一个 &i32 的结构时,尽管每个引用都有不同的生命周期,代码还是会编译。我的理解是,编译器认为内部 & 比外部 & 长:

struct Cat<'a, T>
where
T: 'a,
{
coolness: &'a T,
}

fn main() {
let b = 10;
{
let c = &b;
{
let fluffy = Cat { coolness: &c };
}
}
}

Cat { coolness: &c } 是否扩展为 Cat { coolness: &'a &'a i32 }?对于更多嵌套引用,内部引用是否也假定相同的生命周期等等?

最佳答案

Does Cat { coolness: &c } expand to Cat { coolness: &'a &'a i32 }?

是的,Cat以对引用的引用结束。这可以通过以下代码编译来证明:

let fluffy = Cat { coolness: &c };
fn is_it_a_double_ref(_x: &Cat<&i32>) {}
is_it_a_double_ref(&fluffy);

但是,每个引用的生命周期不一定相同。

My understanding is that the compiler sees that the inner & outlives the outer &

没错。而这正是 T: 'a边界开始发挥作用。

生命周期边界一开始有点难以理解。他们对 T 中包含的引用文献进行了限制。 .例如,给定边界 T: 'static ,不包含任何引用的类型,或仅包含 'static 的类型引用资料,例如i32&'static str ,满足界限,而包含非 'static 的类型引用资料,例如&'a i32 ,不要,因为 'a: 'static是假的。更一般地,给定边界 T: 'a , 类型 T对于每个生命周期参数 'x 满足边界 if在 T , 'x: 'a是真的(没有生命周期参数的类型平凡地满足界限)。

现在回到您的代码。让我们给这些引用起一些名字。我们会说 coolness 的类型是&'fluffy &'c i32 . 'c是变量的生命周期 c'fluffy是变量的生命周期 fluffy (与直觉相反,生命周期对借用的范围进行编码,而不是指示对象的生命周期,尽管编译器确实检查借用不会超出指示对象的生命周期)。这意味着 Fluffy 的类型是Cat<'fluffy, &'c i32> . &'c i32: 'fluffy 是真的吗?

检查是否&'c i32: 'fluffy是真的,我们需要检查是否 'c: 'fluffy是真的。 'c: 'fluffy是真的,因为变量 cfluffy 之后超出范围.

关于rust - 了解 Rust 中参数化结构的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49093143/

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