[英]Result with lifetime parameter - enum with lifetime parameter applied to default T<'a> and E<'a> parameter (Rust)
[英]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僅作為類型使用某種指針: &Num
或Box<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.