[英]Why does the compiler infer different lifetimes for a trait and its implementation?
我目前正在使用rustlearn來評估不同的分類模型。 我遇到的問題基本歸結為:
trait Foo<T> {
fn bar(&self, x: T);
}
struct Baz;
struct Smth;
impl<'a> Foo<&'a Smth> for Baz {
fn bar(&self, x: &Smth) {}
}
fn main() {
let some_foo: Box<Baz> = Box::new(Baz {}); // ok
// let some_foo: Box<Foo<&Smth>> = Box::new(Baz {}); // not ok
let x = Smth {};
some_foo.bar(&x);
}
雖然可以輸入some_foo
作為Box<Baz>
,但是不可能使用Box<Foo<&Smth>>
,因為它會導致編譯器抱怨&x
被丟棄(在main
的末尾),同時仍然借用(在bar
)。 這是(我認為),因為x
是在 some_foo
之后 some_foo
,因此x
在 some_foo
之前被刪除。 移動x
的創建使其在創建some_foo
之前發生將是一個解決方案; 但我們假設不可能¹。
我仍然不明白為什么代碼對some_foo: Box<Baz>
有效some_foo: Box<Baz>
但不是some_foo: Box<Foo<&Smth>>
。 什么是編譯器無法知道(否則它不需要抱怨)?
¹因為您有一組希望交叉驗證的模型,即model.fit(x, y)
,其中x, y
是較大(X, Y)
子集。
盒裝特征對象需要使用所有生命周期來引用Smth
:
let some_foo: Box<for<'a> Foo<&'a Smth>> = Box::new(Baz {});
也許其他人可以解釋為什么編譯器無法導出工作生命周期:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.