这个问题类似于何时在结构中定义多个生命值,但希望足够不同。该问题的答案很有帮助,但专注于一种方法的优势(使用构造中的参考文献不同(,而不是缺点(如果有的话(。这样的问题正在寻找有关如何在创建结构时选择生命的指导。
将其称为捆绑在一起版本,因为 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>)
当您不从额外的通用参数中受益时。