Generics 该特征不能被制成一个对象

Generics 该特征不能被制成一个对象,generics,rust,traits,dynamic-dispatch,trait-objects,Generics,Rust,Traits,Dynamic Dispatch,Trait Objects,我有以下代码: extern crate futures; // 0.1.24 use futures::Future; use std::io; struct Context; pub trait MyTrait { fn receive(context: Context) -> Future<Item = (), Error = io::Error>; } pub struct MyStruct { my_trait: MyTrait, } 我想我

我有以下代码:

extern crate futures; // 0.1.24

use futures::Future;
use std::io;

struct Context;

pub trait MyTrait {
    fn receive(context: Context) -> Future<Item = (), Error = io::Error>;
}

pub struct MyStruct {
    my_trait: MyTrait,
}
我想我知道它为什么会发生,但是我如何从结构中引用这个特性呢?可能吗?也许还有其他方法可以实现相同的行为?

pub-struct-MyStruct
pub struct MyStruct<T>
where
    T: MyTrait,
{
    my_trait: T,
}
哪里 T:我的特点, { 我的特点:T, }

pub-struct-MyStruct{
我的特点:T,
}

您可以向结构中添加类型参数,如中所示,或者使用trait对象

使用type参数有利于提高性能,因为
T
的每个值都将创建结构的专用副本,从而允许静态分派。trait对象使用动态分派,因此它允许您在运行时交换具体类型

特征对象方法如下所示:

pub struct MyStruct<'a> {
    my_trait: &'a dyn MyTrait,
}

pub struct MyStruct有第四个选项可用,但这将使您的结构没有大小。您将无法创建此结构的实例

pub trait MyTrait {}

pub struct MyStruct {
    my_trait: dyn MyTrait + 'static,
}

这意味着
MyStruct
是一个未大小化的类型,您无法创建此类类型的直接实例。由于Rust目前没有直接在堆栈上分配结构的方法,我不知道是否可以创建此类类型的实例。但是,嘿,.

我不喜欢这样的变体,因为这样以后我就不能用另一个实例替换t了。@Shepmaster我知道如何使用未大小的类型。但是我找不到一种方法来实例化这个特定的类型。我知道如何处理像
struct Foo(str)
这样的类型,但是我找不到处理这个类型的方法。我同意你现在不能这样做。当某人在X个月内偶然发现这个答案时,只要有可能更容易地使用DST,就可以使用此链接。问答将更新新信息;这次不太可能。
pub struct MyStruct {
    my_trait: Box<dyn MyTrait>,
}
pub trait MyTrait {}

pub struct MyStruct {
    my_trait: dyn MyTrait + 'static,
}