trait 不能做成一个对象
The trait cannot be made into an object
我有以下代码:
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,
}
当我尝试编译它时,我收到错误消息:
error[E0038]: the trait `MyTrait` cannot be made into an object
--> src/lib.rs:13:5
|
13 | my_trait: MyTrait,
| ^^^^^^^^^^^^^^^^^ the trait `MyTrait` cannot be made into an object
|
= note: method `receive` has no receiver
我想我知道为什么会这样,但我如何从结构中引用特征?可能吗?也许还有其他方法可以实现相同的行为?
pub struct MyStruct<T>
where
T: MyTrait,
{
my_trait: T,
}
或
pub struct MyStruct<T: MyTrait> {
my_trait: T,
}
https://doc.rust-lang.org/book/second-edition/ch10-02-traits.html#trait-bounds
您可以将类型参数添加到您的结构中,如 中那样,或者使用特征对象。
使用类型参数可以提高性能,因为 T
的每个值都会创建一个专门的结构副本,从而允许静态分派。特征对象使用动态分配,因此它允许您在运行时交换具体类型。
特征对象方法如下所示:
pub struct MyStruct<'a> {
my_trait: &'a dyn MyTrait,
}
或者这样:
pub struct MyStruct {
my_trait: Box<dyn MyTrait>,
}
但是,在你的情况下,MyStruct
不能成为一个对象,因为 receive
是一个静态方法。您需要将其更改为将 &self
或 &mut self
作为其第一个参数才能起作用。还有other restrictions.
还有第四个选项可用,但这会使您的结构变小,a.k.a。您将无法创建此结构的实例。
pub trait MyTrait {}
pub struct MyStruct {
my_trait: dyn MyTrait + 'static,
}
这意味着 MyStruct
是一个未确定大小的类型,您不能创建这种类型的直接实例。由于 Rust 目前没有办法直接在堆栈上分配结构,我不知道你是否可以创建这种类型的实例。但是,嘿,it compiles.
我有以下代码:
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,
}
当我尝试编译它时,我收到错误消息:
error[E0038]: the trait `MyTrait` cannot be made into an object
--> src/lib.rs:13:5
|
13 | my_trait: MyTrait,
| ^^^^^^^^^^^^^^^^^ the trait `MyTrait` cannot be made into an object
|
= note: method `receive` has no receiver
我想我知道为什么会这样,但我如何从结构中引用特征?可能吗?也许还有其他方法可以实现相同的行为?
pub struct MyStruct<T>
where
T: MyTrait,
{
my_trait: T,
}
或
pub struct MyStruct<T: MyTrait> {
my_trait: T,
}
https://doc.rust-lang.org/book/second-edition/ch10-02-traits.html#trait-bounds
您可以将类型参数添加到您的结构中,如
使用类型参数可以提高性能,因为 T
的每个值都会创建一个专门的结构副本,从而允许静态分派。特征对象使用动态分配,因此它允许您在运行时交换具体类型。
特征对象方法如下所示:
pub struct MyStruct<'a> {
my_trait: &'a dyn MyTrait,
}
或者这样:
pub struct MyStruct {
my_trait: Box<dyn MyTrait>,
}
但是,在你的情况下,MyStruct
不能成为一个对象,因为 receive
是一个静态方法。您需要将其更改为将 &self
或 &mut self
作为其第一个参数才能起作用。还有other restrictions.
还有第四个选项可用,但这会使您的结构变小,a.k.a。您将无法创建此结构的实例。
pub trait MyTrait {}
pub struct MyStruct {
my_trait: dyn MyTrait + 'static,
}
这意味着 MyStruct
是一个未确定大小的类型,您不能创建这种类型的直接实例。由于 Rust 目前没有办法直接在堆栈上分配结构,我不知道你是否可以创建这种类型的实例。但是,嘿,it compiles.