此問題與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