簡體   English   中英

為什么編譯器會推斷出特征及其實現的不同生命周期?

[英]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.

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