簡體   English   中英

生銹中明顯的生命周期錯誤

[英]Explicit lifetime error in rust

我有一個我想要使用的生銹枚舉,但是我收到了錯誤;

error: explicit lifetime bound required
numeric(Num),
        ~~~

有問題的枚舉:

enum expr{
   numeric(Num),
   symbol(String),
}

我不認為我明白這里借的是什么。 我的意圖是Num或String與包含expr的生命周期相同,允許我從函數返回它們。

錯誤消息有點誤導。 Num是一個特征,它是一個動態大小的類型,所以如果沒有某種間接(引用或Box ),你就不能擁有它的值。 這樣做的原因是簡單的; 問自己一個問題: expr枚舉值必須有多大(以字節為單位)? 它肯定至少和String一樣大,但Num呢? 任意類型都可以實現這個特性,所以為了成為聲音, expr必須具有無限大小!

因此,您可以將traits僅作為類型使用某種指針: &NumBox<Num> 指針始終具有固定大小,並且特征對象是“胖”指針,在其中保留其他信息以幫助進行方法調度。

特征通常也用作泛型類型參數的邊界。 因為泛型是單形的,所以它們在編譯的代碼中變成靜態類型,因此它們的大小總是靜態地知道並且它們不需要指針。 使用泛型應該是默認方法,只有在您知道泛型不適合您的原因時才應切換到特征對象。

這些是您的類型定義的可能變體。 使用泛型:

enum Expr<N: Num> {
    Numeric(N),
    Symbol(String)
}

Trait對象通過引用:

enum Expr<'a> {  // '
    Numeric(&'a Num + 'a),
    Symbol(String)
}

帶框的特征對象:

enum Expr {
    Numeric(Box<Num + 'static>),  // ' // I used 'static because numbers usually don't contain references inside them
    Symbol(String)
}

您可以在官方指南中閱讀有關泛型和特征的更多信息,但目前它缺乏有關特征對象的信息。 如果你不明白,請問。

更新

'a in

enum Expr<'a> {  // '
    Numeric(&'a Num + 'a),
    Symbol(String)
}

是一個終身參數。 它定義了引用的生命周期和Numeric變體內的特征對象內部。 &'a Num + 'a是一種類型,你可以將其視為“參考背后的特征對象,它至少與'a一樣長, 'a其中的引用至少與'a一樣長。 也就是說,首先,指定'a作為參考生命周期: &'a ,其次,指定特征對象內部的生命周期: Num + 'a 后者是必需的,因為traits可以針對任何類型實現,包括其中包含引用的類型,因此您需要將這些引用的最小生命周期也放入trait對象類型,否則借用檢查將無法與trait對象一起正常工作。

Box的情況非常相似。 Box<Num + 'static>是“堆分配框內的特征對象,其中包含引用,其中至少與'static一樣長。 Box類型是堆分配的擁有數據的智能指針。 因為它擁有它擁有的數據,所以它不需要像引用那樣的生命周期參數。 但是,trait對象仍然可以在其中包含引用,這就是為什么仍然使用Num + 'a ; 我只是選擇使用'static生命周期而不是添加另一個生命周期參數。 這是因為數字類型通常很簡單,並且里面沒有引用,它相當於'static綁定。 當然,如果需要,您可以自由添加生命周期參數。

請注意,所有這些變體都是正確的:

&'a SomeTrait + 'a
&'a SomeTrait + 'static
Box<SomeTrait + 'a>  // '
Box<SomeTrait + 'static>

即使這是正確的, 'a'b作為不同的生命周期參數:

&'a SomeTrait + 'b

雖然這很少有用,因為'b必須至少和'a一樣長(否則特性對象的內部可能會在它本身仍然存活時失效),所以你也可以使用&'a SomeTrait + 'a

暫無
暫無

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

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