` 当 `MyTrait` 有参数化类型时?,rust"/>

首页 > 解决方案 > 如何持有一个`盒子` 当 `MyTrait` 有参数化类型时?

问题描述

我需要为运行时选择保留一个选项Box<Device>

device: Option<Box<dyn Device<'a>>>

但该Device特征具有相关类型:

pub trait Device<'a> {
    type RxToken: RxToken + 'a;
    type TxToken: TxToken + 'a;

我越来越

必须指定关联类型的值RxToken(来自 trait virtual_tun::smoltcp::phy::Device),TxToken(来自 trait )virtual_tun::smoltcp::phy::Device

如果它们在一个盒子里,为什么我需要指定这些类型?Device我存储在其中的任何实现对象Box都已经拥有RxToken并被TxToken选中。我认为没有理由必须指定它。

在这种情况下我能做什么?

标签: rust

解决方案


它不是那么多,Box而是dyn允许您使用动态类型而不是静态类型(只是Box可以容纳未调整大小的类型)。

除此之外,您需要指定关联的类型,因为即使类型dyn Device<'_>是动态的,您仍然需要以静态方式与其交互。如果 trait 接受或返回关联类型(这是常态),你就会遇到麻烦。

推断您的示例:

trait RxToken {}
trait TxToken {}

trait Device<'a> {
    type RxToken: RxToken + 'a;
    type TxToken: TxToken + 'a;
    
    fn read(&self) -> Self::RxToken;
    fn write(&self) -> Self::TxToken;
}

fn main() {
    let device: Option<Box<dyn Device<'_>>> = None;
    
    let _rx_token = device.as_ref().unwrap().read();  // ?
    let _tx_token = device.as_ref().unwrap().write(); // ?
}

的类型是_rx_token什么?它没有在任何地方指定。不可能,RxToken + 'a因为那是一个bound,而不是一个type。这不可能是dyn RxToken + 'a因为尚不支持未调整大小的右值。

如果您需要以dyn Device<'_>完全动态的方式使用 a,则不能有关联的类型。如果您仍然想拥有一些RxTokenTxToken保持活力,则需要更多的动力,例如:

trait Device<'a> {
    fn read(&self) -> Box<dyn RxToken>;
    fn write(&self) -> Box<dyn TxToken>;
}

推荐阅读