[英]Tell the Rust compiler that the lifetime of a parameter is always identical to a struct's lifetime
抱歉,如果這很明顯,我從 Rust 開始。
我正在嘗試實現一個簡單的組合關系(一個 object 是另一個的單一所有者,當外部 object 死亡時,內部 object 會自動銷毀)。
我最初認為它就像聲明這樣的結構一樣簡單:
struct Outer {
inner: Inner
}
據我所知,這正是我想要的:內部屬性由外部結構擁有,並且每當外部 object 消失時都會被銷毀。
但是,就我而言, Inner
類型來自庫,並且具有生命周期參數。
// This is illegal
struct Outer {
inner: Inner<'a>
}
// I understand why, I'm using an undeclared lifetime parameter
我已經閱讀了一些關於生命周期參數的內容(但我還沒有完全習慣它們),我不確定是否有一些語法可以告訴 Rust 編譯器“這個字段期望的生命周期是它的所有者的”,或者是否這是不可能的(在這種情況下,構建此代碼的正確方法是什么?)。
“這個領域期望的壽命是它的所有者的”,
這是不可能的。
通常,您應該將具有生命周期參數的任何類型(無論是引用&'a T
還是 struct Foo<'a>
或其他任何東西)都理解為指向其他地方並且獨立存在的東西。
在您的情況下,無論Inner
借用什么(無論它的生命周期是什么)都不能成為Outer
的一部分。 這是因為如果是這樣, Outer
就會借用自己的一部分,這使得Outer
無法正常使用。 (這樣做需要pinning ,防止結構移動,從而使引用無效,如果不求助於unsafe
的代碼,目前無法設置。)
因此,您可能會遇到三種情況:
你的完整情況是
struct Outer { some_data: SomeOtherType, inner: Inner<'I_want_to_borrow_the_some_data_field>, }
這在基本的 Rust 中是不可能的; 你需要要么
some_data
放在Outer
以外的其他地方,ouroboros
庫,它提供了構建健全的自引用結構的機制(以堆分配和復雜的接口為代價),或以其他方式設計不同的數據結構。
Inner
借用的數據已經是獨立的。 在這種情況下,正確的解決方案是傳播生命周期參數。
struct Outer<'a> { inner: Inner<'a>, }
實際上沒有任何借來的數據; Inner
提供了這種可能性,但在這種情況下實際上並未使用它(或者借用的數據是編譯時常量)。 在這種情況下,您可以使用'static
生命周期。
struct Outer { inner: Inner<'static>, }
您可以在Self
上使用綁定:
struct Outer<'a> where Self: 'a {
inner: Inner<'a>
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.