此问题与When is it useful to define multiple lifetimes in a struct?类似,但希望不同。这个问题的答案是有帮助的,但是关注一种方法的优点(在struct中使用不同的生命期),而不是缺点(如果有的话)。这个问题就像这样,正在寻找如何在创建结构时选择生命周期的指导。为什么你会在结构中使用相同的生命周期参考?
称此为绑在一起版本,因为X和ÿ需要具有相同的寿命:
struct Foo<'a> {
x: &'a i32,
y: &'a i32,
}
和称此为松散版本,因为寿命可以变化:
struct Foo<'a, 'b> {
x: &'a i32,
y: &'b i32,
}
对引用问题的回答给出了一个明确的例子:客户端代码可以编译/运行给定宽松版本,但将连接在一起版本失败。是不是说,对于适用于任何客户端代码捆绑在一起版本还将为宽松版工作,将得到保证的情况下一样安全(即安全的)?正面是不正确的。从结构设计师的角度来看,宽松的版本显然更加灵活。鉴于这是一个很好/被接受的答案,指导可能是 - 当在结构中使用引用总是给它们不同的生命期。
这个建议的缺点是什么,忽略了额外的输入?例如,是否有益于要求引用在结构体中具有相同的生命周期?
Maybe * foo <...>(... b:&str)*应该是* foo <...>(... b:'b&str)*?奇怪的没有编译器错误或警告未使用的范围'b。 随着原来的问题,我认为需要不同的生活时间是非常人为的。但是,嘿,如果可能发生,就让他们独立。我认为这个例子显示了同样的生活时间的优点也是非常人为的。谁知道客户可能面临的所有潜在的终生问题(或应该知道)?让额外的打字指导我回到只是设置它们相同。不幸的是,一旦选择改变并不容易。 – user1338952
@ user1338952是的,绝大多数例子都是人为设计的。这就是例子的工作原理。你的第二点被称为*软件设计*。例如,当你可以写'add (a:A,b:A)'或者当你可以写'add (a:A,A)时,为什么你会写'add(a:u8,b:u8) b:B)'或者当你写'add (a:A,b:B)'?思考如何使用你的代码是使软件既具有挑战性又有益的事情。是的,我们有时会弄错,有时我们必须做出(突破)改变。 – Shepmaster
涵盖主题的任何博客(即*为您的结构选择生命期时的*软件设计*选择)?这比以下多一点:它是如何工作的。预发行书*编程锈*有部分*不同的寿命参数*触及问题。似乎建议先尝试一样,如果你发现你需要它们独立更换它们。不确定的比例。 – user1338952