Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Rust中,如何修复错误“trait`core::kinds::Sized`没有为`Object+'a`类型实现”_Rust - Fatal编程技术网

在Rust中,如何修复错误“trait`core::kinds::Sized`没有为`Object+'a`类型实现”

在Rust中,如何修复错误“trait`core::kinds::Sized`没有为`Object+'a`类型实现”,rust,Rust,通过下面的代码,我得到了一个错误:没有为类型Object+实现trait core::kinds::Sized'a错误。我已经删除了触发错误所不需要的所有其他代码 fn main() { } pub trait Object { fn select(&mut self); } pub struct Ball<'a>; impl<'a> Object for Ball<'a> { fn select(&mut self) {

通过下面的代码,我得到了一个错误:没有为类型Object+实现trait core::kinds::Sized'a错误。我已经删除了触发错误所不需要的所有其他代码

fn main() {
}

pub trait Object {
    fn select(&mut self);
}

pub struct Ball<'a>;

impl<'a> Object for Ball<'a> {
    fn select(&mut self) {
        // Do something
    }
}

pub struct Foo<'a> {
    foo: Vec<Object + 'a>,
}
游戏围栏:

完全错误是:

<anon>:15:1: 17:2 error: the trait `core::kinds::Sized` is not implemented for the type `Object+'a`
<anon>:15 pub struct Foo<'a> {
<anon>:16     foo: Vec<Object + 'a>,
<anon>:17 }
<anon>:15:1: 17:2 note: the trait `core::kinds::Sized` must be implemented because it is required by `collections::vec::Vec`
<anon>:15 pub struct Foo<'a> {
<anon>:16     foo: Vec<Object + 'a>,
<anon>:17 }
error: aborting due to previous error
playpen: application terminated with error code 101

我是个新手,不知道从这里该去哪里。有什么建议吗?

这里的基本问题是:

要存储对象的向量。现在,向量是一个平面数组:每个条目都在另一个条目之后。 但对象是一个特性,虽然您只为球实现了它,但也可以为帽子和三角形实现它。但它们在内存中的大小可能不同!所以对象本身并没有大小

有两种方法可以解决此问题:

使Foo成为泛型,并且在每个Foo中只存储一种类型的对象。我觉得这可能不是你想要的。游戏围栏: 间接寻址:不是直接在数组中存储对象,而是存储框。下面是一个playpen链接,用于执行此操作。
注意第三种解决方案:使用枚举而不是特征。这将关闭可以表示的类型集,因此假设所有类型都已调整大小,它将创建一个调整大小的枚举。它工作得很好,但对我来说不够灵活。每次我添加一个实现对象方法的新东西时,我必须在代码中查找并更改10-15个位置。在更简单的代码中,这很好,但是我的更改开始超出它。谢谢你的回答。你提供的两个playpen链接都不是编译的,仅供参考,因为如果答案中包含一个这样的playpen,那就太好了!