处理盒子和特征对象
Dealing with boxes and trait objects
我有一个具有某些特征 core::Object
对象的盒子向量:
pub struct Packfile<'a> {
pub version: u32,
pub objects: Vec<Box<core::Object + 'a>>,
...
现在,我想要 Packfile
的一种方法 return 这些对象之一可选:-> Option<Box<core::Object + 'a>>
。因此,将 i
作为我想要的索引的参考,我 return 这个:
Some(self.objects[*i])
好的,这不起作用,因为我正在将盒子移到 vec 之外。说得通。让我们 clone
它(core::Object
继承自 Clone
)。
Some(self.objects[*i].clone())
现在,这是我不明白的地方。 self.objects[*i]
是一个盒子, clone()
on boxes 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()),
^~~~~~~~~~~~~~~~~~~~~~~~
所以我不明白为什么我在 clone()
中得到 T
而不是 Box<T>
。
你能帮帮我吗?
So I don't get why I'm getting a T and not a Box out of clone().
方法也 自动取消引用。我不知道 core::Object
是什么,但如果它实现了 Clone
,这就是为什么,我敢打赌。
如果您只需要对对象的引用就可以了,您可以这样做:
Some(&self.objects[*i])
您甚至可以实现 Index
以利用索引运算符,因此您可以 some_packfile[3]
.
我有一个具有某些特征 core::Object
对象的盒子向量:
pub struct Packfile<'a> {
pub version: u32,
pub objects: Vec<Box<core::Object + 'a>>,
...
现在,我想要 Packfile
的一种方法 return 这些对象之一可选:-> Option<Box<core::Object + 'a>>
。因此,将 i
作为我想要的索引的参考,我 return 这个:
Some(self.objects[*i])
好的,这不起作用,因为我正在将盒子移到 vec 之外。说得通。让我们 clone
它(core::Object
继承自 Clone
)。
Some(self.objects[*i].clone())
现在,这是我不明白的地方。 self.objects[*i]
是一个盒子, clone()
on boxes 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()),
^~~~~~~~~~~~~~~~~~~~~~~~
所以我不明白为什么我在 clone()
中得到 T
而不是 Box<T>
。
你能帮帮我吗?
So I don't get why I'm getting a T and not a Box out of clone().
方法也 自动取消引用。我不知道 core::Object
是什么,但如果它实现了 Clone
,这就是为什么,我敢打赌。
如果您只需要对对象的引用就可以了,您可以这样做:
Some(&self.objects[*i])
您甚至可以实现 Index
以利用索引运算符,因此您可以 some_packfile[3]
.