我目前正在使用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)
的子集。
答案 0 :(得分:3)
盒装特质对象需要与所有生命周期一起使用才能引用Smth
:
let some_foo: Box<for<'a> Foo<&'a Smth>> = Box::new(Baz {});
也许其他人可以解释为什么编译器无法获得工作生命周期:)