gpt4 book ai didi

rust - 在结构实现中使用不同的生命周期

转载 作者:行者123 更新时间:2023-11-29 07:51:38 25 4
gpt4 key购买 nike

我正在努力更好地理解 Rust 生命周期。

struct Name<'a> {
arg: &'a u8,
}
impl<'a> Name<'a> {
fn new1(arg: &'a u8) -> Name<'a> {
Name { arg }
}
fn new2<'b>(arg: &'b u8) -> Name<'b> {
Name { arg }
}
}

函数 new1new2 之间有什么区别吗?我假设 arg&self 会很重要吗?在任何情况下,new2 实现是首选还是其他方式?

最佳答案

这两种方法最终完全相同,但值得了解其中的原因。在此过程中,我们将了解终身强制

如果第二个生命周期比第一个生命周期短(或者更确切地说,包含在第一个生命周期内),则可以将一个生命周期强制转换为另一个生命周期。这通常记为 'a: 'b , 表示生命周期 'a整个生命周期'b .通常的术语是'a超过生命周期'b .这种胁迫的原因是,如果需要,你总是可以缩短生命周期。如果引用在某个生命周期内有效,那么它在较长生命周期中包含的任何较短生命周期内也有效。

考虑到这一点,什么样的论点可以new1new2拿?我们有一个固定的生命周期 'a因为整个实现在那个生命周期中是通用的。然而,new1不能只取&'a u8 , 但任何 &'b u8如果'b可以强制为 'a .即 'b: 'a'b长于 'a .

new2略有不同,但最终具有相同的效果。该方法在生命周期内是通用的'b并且可以采取任何 &'c u8如果'c: 'b . new2'a 中在技术上仍然是通用的, 但因为它不使用 'a完全可以忽略。也就是说,忽略通用参数会令人困惑(为什么要有参数?),所以最好使用 new1相反。

选择 new1 的另一个原因在 new2是它更适合 Self .如果我们尝试将输出更改为 Self

impl<'a> Name<'a> {
fn new1(arg: &'a u8) -> Self {
Name { arg }
}
fn new2<'b>(arg: &'b u8) -> Self {
Name { arg }
}
}

编译器报错。为什么?现在输出必须是 Name<'a>new2 ,我们正在返回 Name<'b> .这不可强制为 Name<'a>除非'b: 'a , 所以我们必须将其添加为 'b 的界限:

impl<'a> Name<'a> {
fn new1(arg: &'a u8) -> Self {
Name { arg }
}
fn new2<'b: 'a>(arg: &'b u8) -> Self {
Name { arg }
}
}

(playground link)

在这种情况下,很明显 new1是优越的,因为它甚至不需要第二个生命周期,但仍然允许完全相同的输入。

关于rust - 在结构实现中使用不同的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57682255/

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