我有一个包含某些特征core::Object
对象的框的向量:
pub struct Packfile<'a> {
pub version: u32,
pub objects: Vec<Box<core::Object + 'a>>,
...
现在,我希望一种Packfile
方法可以选择返回其中一个对象:-> Option<Box<core::Object + 'a>>
.因此,将i
作为我想要的索引的引用,我返回以下内容:
Some(self.objects[*i])
好的,这不起作用,因为我正在将盒子移到 vec 之外。意义。让我们clone
它(core::Object
继承自Clone
)。
Some(self.objects[*i].clone())
现在,这是我不明白的。 self.objects[*i]
是一个盒子,盒子上的clone()
是这样做的:impl<T> Clone for Box<T> where T: Clone { fn clone(&self) -> Box<T>; }
所以clone()
应该给我一个盒子,对吧?但是我收到此错误:
src/packfile/mod.rs:190:20: 190:44 error: mismatched types:
expected `Box<core::Object + 'a>`,
found `core::Object + 'a`
(expected box,
found trait core::Object)
src/packfile/mod.rs:190 Some(self.objects[*i].clone()),
^~~~~~~~~~~~~~~~~~~~~~~~
所以我不明白为什么我会得到一个T
而不是一个Box<T>
clone()
.
你可以帮我吗?
如果您只引用对象就可以了,您可以执行以下操作:
Some(&self.objects[*i])
您甚至可以实现Index
以利用索引运算符,因此您可以执行some_packfile[3]
。
所以我不明白为什么我要从克隆()中得到一个 T 而不是一个盒子。
方法也会执行自动取消引用。我不知道core::Object
是什么,但如果它实现了Clone
,这就是为什么,我敢打赌。