簡體   English   中英

特征不能成為一個對象

[英]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

我想我知道它為什么會發生,但我如何從結構中引用特征? 可能嗎? 也許還有其他方法可以實現相同的行為?

您可以在結構中添加類型參數,如Zernike的答案 ,或使用特征對象。

使用type參數對性能更好,因為T每個值都將創建struct的專用副本,從而允許靜態分派。 特征對象使用動態分派,因此它允許您在運行時交換具體類型。

特征對象方法如下所示:

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

或這個:

pub struct MyStruct {
    my_trait: Box<dyn MyTrait>,
}

但是,在您的情況下, MyStruct無法成為對象,因為receive是一個靜態方法。 您需要將其更改為使用&self&mut self作為其工作的第一個參數。 還有其他限制

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

有第四個選項可用,但是這會使你的結構不合格,也就是說你將無法創建這個結構的實例。

pub trait MyTrait {}

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

這意味着MyStruct是一個MyStruct類型,您無法創建此類型的直接實例。 由於Rust目前沒有辦法直接在堆棧上分配結構,我不知道你是否可以創建這種類型的實例。 但是,嘿, 它編譯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM