处理盒子和特征对象

时间:2015-01-23 01:30:41

标签: rust

我有一些包含一些特征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外面的盒子。说得通。我们clonecore::Object继承自Clone)。

Some(self.objects[*i].clone())

现在,这是我不明白的地方。 self.objects[*i]是一个方框,clone()位于方框do this上: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()

你能帮助我吗?

2 个答案:

答案 0 :(得分:2)

  

所以我不知道为什么我从克隆()获得T而不是Box。

方法执行auto deref。我不知道core::Object是什么,但如果它实现了Clone,那就是为什么,我打赌。

答案 1 :(得分:2)

如果只对对象的引用很好,可以执行以下操作:

Some(&self.objects[*i])

您甚至可以实施Index以便能够利用索引编制器,因此您可以执行some_packfile[3]