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,
}