为什么您会在结构中使用相同的一生来进行参考



这个问题类似于何时在结构中定义多个生命值,但希望足够不同。该问题的答案很有帮助,但专注于一种方法的优势(使用构造中的参考文献不同(,而不是缺点(如果有的话(。这样的问题正在寻找有关如何在创建结构时选择生命的指导。

将其称为捆绑在一起版本,因为 x y 必须具有相同的寿命:

struct Foo<'a> {
    x: &'a i32,
    y: &'a i32,
}

并将其称为 loose 版本,因为寿命可以变化:

struct Foo<'a, 'b> {
    x: &'a i32,
    y: &'b i32,
}

引用问题的答案给出了一个清晰的情况,在这些情况下,客户代码可以在 loode 版本给定 sodial clited clited congide 版本的情况下进行编译/运行。是否有适用于绑定在一起的客户代码也适用于 loods 版本,并将得到保证em>(即安全(?正面是不正确的。从结构设计人员的角度来看, Looce 版本显然更灵活。鉴于这是一个很好/接受的答案,指导可能是 - 当使用struct 始终中的参考时,请给他们独特的生命。

这个建议的缺点是什么,忽略了额外的打字?例如,在结构中需要有好处吗?

在结构中需要参考具有相同的寿命

是否有好处

是的,它超出了结构。如果一生总是彼此不同,那么您将无法写下此功能:

fn foo<'a, 'b>(a: &'a str, b: &'b str) -> &str {
    // What lifetime to return?
    if (global_random_number() == 42) {
        a
    } else {
        b
    }
}

应用于结构,您可以拥有这样的东西:

struct EvenOrOdd<'a, 'b> {
    even: &'a str,
    odd: &'b str,
}
impl<'a, 'b> EvenOrOdd<'a, 'b> {
    fn do_it(&self, i: u8) -> &str {
        if i % 2 == 0 {
            self.even
        } else {
            self.odd
        }
    }
}

请注意,虽然它进行了编译,但它不会返回可以超过结构本身的字符串 ,这不是预期的。该代码失败,即使它应该能够工作:

fn foo<'a, 'b>(a: &'a str, b: &'b str) {
    let result = { EvenOrOdd { even: a, odd: b }.do_it(42) };
    println!("{}", result);
}

这将与统一的寿命一起使用:

struct EvenOrOdd<'a> {
    even: &'a str,
    odd: &'a str,
}
impl<'a> EvenOrOdd<'a> {
    fn do_it(&self, i: u8) -> &'a str {
        if i % 2 == 0 {
            self.even
        } else {
            self.odd
        }
    }
}

这与链接的答案相反,该答案有评论:

您希望能够在使用

之后占据汇总价值并拆分部分

在这种情况下,我们要采用汇总值, unify

在稀有场合,您可能需要在不同的寿命和统一的寿命之间穿线:

struct EvenOrOdd<'a, 'b: 'a> {
    even: &'a str,
    odd: &'b str,
}
impl<'a, 'b> EvenOrOdd<'a, 'b> {
    fn do_it(&self, i: u8) -> &'a str {
        if i % 2 == 0 {
            self.even
        } else {
            self.odd
        }
    }
}

虽然在需要时这很有用,但我无法想象如果我们每次都必须这样写的话,牙齿的哭泣和咬伤就会爆发。


忽略额外的打字

我不会。有

foo<'a>(Bar<'a>)

绝对比

更好
foo<'a, 'b', 'c, 'd>(Bar<'a, 'b', 'c, 'd>)

当您不从额外的通用参数中受益时。

最新更新