为什么编译器会推断出特征及其实现的不同生命周期?

时间:2017-12-13 13:16:00

标签: rust

我目前正在使用rustlearn来评估不同的分类模型。我遇到的问题基本归结为:

response.Content.document

虽然可以将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之前被删除 {{ 1}}。 移动x的创建,使其在创建some_foo之前发生将是一个解决方案;但我们假设不可能¹。

我仍然不明白为什么代码对x有效,但对some_foo无效。什么是编译器无法知道的(否则它不需要抱怨)?

¹,因为您有一组希望交叉验证的模型,即some_foo: Box<Baz>其中some_foo: Box<Foo<&Smth>>是较大model.fit(x, y)的子集。

1 个答案:

答案 0 :(得分:3)

盒装特质对象需要与所有生命周期一起使用才能引用Smth

let some_foo: Box<for<'a> Foo<&'a Smth>> = Box::new(Baz {});

也许其他人可以解释为什么编译器无法获得工作生命周期:)