簡體   English   中英

告訴 Rust 編譯器參數的生命周期始終與結構的生命周期相同

[英]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的代碼,目前無法設置。)

因此,您可能會遇到三種情況:

  1. 你的完整情況是

    struct Outer { some_data: SomeOtherType, inner: Inner<'I_want_to_borrow_the_some_data_field>, }

    這在基本的 Rust 中是不可能的; 你需要要么

    • some_data放在Outer以外的其他地方,
    • 使用ouroboros庫,它提供了構建健全的自引用結構的機制(以堆分配和復雜的接口為代價),

    或以其他方式設計不同的數據結構。

  2. Inner借用的數據已經是獨立的。 在這種情況下,正確的解決方案是傳播生命周期參數。

     struct Outer<'a> { inner: Inner<'a>, }
  3. 實際上沒有任何借來的數據; 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM