簡體   English   中英

生銹壽命只參考參考文獻?

[英]Do rust lifetimes only refer to references?

我正試圖把我的頭腦包裹在Rust的生命周期中(因為官方指南並沒有真正解釋它們)。

生銹時間僅涉及參考,或者它們是否也可以引用基本/原始值?

生命周期是值與對所述值的引用之間的聯系。

為了理解這個鏈接,我將使用一個破碎的並行:房屋和地址。

房子是一個物理實體。 它建在一塊土地上,有時會生活幾十年或一百年,在此期間可能會多次翻修,並且很可能在某些時候被毀壞。

地址是一個邏輯實體,它可以指向房屋,或指向其他物理實體(字段,學校,火車站,公司的總部......)。


房屋的使用壽命相對清晰:它代表房屋可用的持續時間,從房屋建造的那一刻到房屋被毀壞的那一刻。 在這段時間里,這所房子可能經過多次翻修,過去簡單的小屋可能最終成為一個完整的庄園,但這對我們來說並不重要; 為了我們的目的,這所房子生活在這些轉變中。 只有它的創造和最終的破壞才有意義......盡管如果在我們把屋頂向下撕裂時沒有人碰巧在卧室里可能會更好。

現在,想象一下你是一名房地產經紀人。 你不保留你在辦公室出售的房屋,這是不切實際的; 但是,請保留他們的地址!

沒有終身的概念,你的客戶會不時抱怨,因為你發送給他們的地址......是垃圾場的地址,而不是那個可愛的兩層樓的房子。 您可能還會從警察局得到一些詢問,詢問為什么人們在剛剛被摧毀的房子里找到了從您辦公室拿到小冊子的人,隨后的訴訟可能會關閉您的業務。

這顯然對您的業務構成風險,因此您應該尋求更好的解決方案。 如果每個地址都可以標記它所指的房子的生命周期,那么你知道不會讓人們去死(或失望)?


您可能已經在垃圾轉儲中識別出C手動內存管理策略; 在C中,由 房地產經紀人 開發人員來確保您的地址(指針/引用)始終指向生活房屋。

然而,在Rust中,引用標記有一個特殊標記: 'enough ; 它表示所引用值的生命周期的下限。

當編譯器檢查您對引用的使用是否安全時,它會詢問以下問題:

這個價值還活着嗎?

不要緊的值是否將在那里為100年后,只要活得長'enough了,你有它的用途。

不,他們也提到價值觀。 如果從背景中不清楚他們將活多久,他們也必須注釋。 然后它被稱為終身綁定。

在下面的示例中,有必要指定引用的值至少與引用本身一樣長:

use std::num::Primitive;

struct Foo<'a, T: Primitive + 'a> {
    a: &'a T
}

嘗試刪除+ 'a ,編譯器會抱怨。 這是必需的,因為T可以是實現Primitive任何東西。

是的,它們只引用引用,但是這些引用可以引用原始類型。 Rust不像Java(和類似的語言)那樣區分原始類型(通過值傳遞)和更復雜的類型(Java中的對象),它們通過引用傳遞。 復雜類型可以在堆棧上分配並按值傳遞,並且可以將引用轉換為基本類型。

例如,這是一個函數,它接受對i32的兩個引用,並返回對較大引用的引用:

fn bigger<'a>(a: &'a i32, b: &'a i32) -> &'a i32 {
    if a > b { a } else { b }
}

它使用生命周期'a來表示返回引用的生命周期與傳入的引用的生命周期相同。

當您在代碼中看到生命周期注釋(例如'a )時,幾乎總是涉及引用借用指針

借用指針的完整語法是&'a T 'a指涉對象的一生。 T是指示物的類型。

結構和枚舉可以具有生命周期參數。 這通常是包含借用指針的struct或enum的結果。 將借用指針存儲在結構或枚舉中時,必須明確說明指示對象的生命周期。 例如,標准庫中的Cow枚舉包含其中一個變體中的借用指針。 因此,它有一個生命參數,用於借用指針的類型來定義指示對象的生命周期。

特征可以具有類型邊界,也可以具有生命周期限制。 生命期界限表示該特征的具體實現中所有借用指針有效的最大區域(即它們的指示對象存活)。 如果實現不包含借用指針,那么生命周期將被推斷為'static 生命周期邊界可以出現在類型參數定義中, where子句和trait對象中。

有時,您可能希望使用lifetime參數定義結構或枚舉,但沒有相應的值來借用。 您可以使用標記類型,例如ContravariantLifetime<'a> ,以確保生命周期參數具有正確的方差( ContravariantLifetime對應於借用指針的方差;沒有標記,生命周期將是雙變量,這意味着生命周期可能是用任何其他生命代替......不是很有用!)。 請在此處查看此用例的示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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