我發現了一生誤差鏽1.14由於使用相關聯的類型,由以下兩個類似的方案證實,其編譯沒有錯誤的第一和其具有第二終身錯誤。壽命錯誤使用相關性狀類型與壽命參數
項目#1 - 編譯沒有錯誤
trait Trait<'a> {
type T;
}
struct Impl;
impl<'a> Trait<'a> for Impl {
type T = std::marker::PhantomData<&'a()>;
}
struct Alpha<'a, T: Trait<'a>> {
_dummy: std::marker::PhantomData<(&'a(), T)>,
}
fn use_alpha<'a>(_: &'a Alpha<'a, Impl>) {}
fn main() {
for x in Vec::<Alpha<Impl>>::new().into_iter() {
use_alpha(&x); // <-- ok
}
}
項目#2 - 具有壽命錯誤
trait Trait<'a> {
type T;
}
struct Impl;
impl<'a> Trait<'a> for Impl {
type T = std::marker::PhantomData<&'a()>;
}
struct Alpha<'a, T: Trait<'a>> {
_dummy: std::marker::PhantomData<(&'a(), T::T)>,
}
fn use_alpha<'a>(_: &'a Alpha<'a, Impl>) {}
fn main() {
for x in Vec::<Alpha<Impl>>::new().into_iter() {
use_alpha(&x); // <-- !error!
}
}
這裏的第2程序編譯時錯誤:
error: `x` does not live long enough
--> src/main.rs:20:5
|
19 | use_alpha(&x); // <-- !error!
| - borrow occurs here
20 | }
| ^`x` dropped here while still borrowed
|
= note: values in a scope are dropped in the opposite order they are created
下面是兩個方案中的diff:
#[derive(Clone)]
struct Alpha<'a, T: Trait<'a>> {
- _dummy: std::marker::PhantomData<(&'a(), T)>,
+ _dummy: std::marker::PhantomData<(&'a(), T::T)>,
}
唯一的區別是,通過改變所述第一程序使用相關聯的類型,而不是在struct
定義類型參數時,出現壽命錯誤。我不知道爲什麼會發生這種情況。據我所知,關聯類型不應該產生任何額外的生存期限制 - 這一切都只是'a
,但顯然Rust編譯器不同意。
如果我更換第二個程序的main
簡單的實例化功能重複,那麼一生錯誤消失。那就是:
fn main() {
let x = Alpha::<Impl> { _dummy: std::marker::PhantomData };
use_alpha(&x); // <-- ok in both programs
}
我不明白爲什麼迭代與直接實例化有什麼不同。
我仍然在努力工作了這一點。但我_did_發現你可以使用'iter()'而不是'into_iter()'並且它可以工作。 –