gpt4 book ai didi

rust - Rust是否会缩小生命周期以满足对其定义的约束?

转载 作者:行者123 更新时间:2023-12-03 11:41:28 24 4
gpt4 key购买 nike

请考虑以下示例(playground):

struct Container<'short, 'long: 'short, T: 'long> {
short_prop: &'short u8,
long_prop: &'long T,
}

fn main() {
let value = 9;
let long = &value;

{
let short = &value;
let res = Container {
short_prop: long,
long_prop: short, // why is this not an error?
};

println!("{} {}", res.short_prop, res.long_prop);
}
}
Container中,我指定 'long: 'short,我认为这意味着 'long的生存时间至少应与 'short一样长。在 main中,变量 long的生存期应长于 short,因为它的作用域更大。
因此, Container期望 long_prop中的任何内容至少与 short_prop中的任何内容一样有效。但是,对于我将生命周期更长的 long传递给 short_prop并将生命周期较短的 short传递给 long_prop,编译器感到非常满意。
这是因为在 Container实例化时,编译器将 long的生存期缩小为等于 short的生存期,从而满足了 'long: 'short约束(因为生存期相等就可以了)?还是还有其他原因?

最佳答案

Is this because at the instantiation of Container the compiler narrows the lifetime of 'long to be equal to the lifetime of 'short thus satisfying the 'long: 'short constraint (since equality of lifetimes is fine)?


是的。

Or is there another reason?


没有。
这是一个带有更简单的 Container结构的示例,该结构一次仅包含1个引用。它可以同时保留 longshort引用的原因是,较长的生存期是较短生存期的子类型,但是 container变量的总体生存期被缩小为这两个生存期的最小重叠,这意味着 container同时超出了范围就像 short一样:
#[derive(Debug)]
struct Container<'a> {
some_ref: &'a str
}

fn main() {
let long = String::from("long");
let long_ref = &long;

let mut container = Container {
some_ref: long_ref,
};

dbg!(&container);

{
let short = String::from("short");
let short_ref = &short;

container.some_ref = short_ref;

dbg!(&container);
} // both short & container go out of scope here

dbg!(&container); // error, container dropped in block above, has same lifetime as short
}
playground

关于rust - Rust是否会缩小生命周期以满足对其定义的约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66017394/

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