繁体   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