gpt4 book ai didi

rust - 当 `Box` 具有参数化类型时,如何保存 `MyTrait` ?

转载 作者:行者123 更新时间:2023-12-03 11:27:45 24 4
gpt4 key购买 nike

我需要保留运行时选择的选项 Box<Device> :

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

但是Device特质具有关联的类型:

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

我懂了

the value of the associated types RxToken (from traitvirtual_tun::smoltcp::phy::Device), TxToken (from traitvirtual_tun::smoltcp::phy::Device) must be specified

如果这些类型位于一个框中,为什么我需要指定它们?无论实现 Device 的任何对象我存储在这个Box中已经有了它的RxTokenTxToken选择的。我认为没有理由必须指定它。

这种情况我能做什么?

最佳答案

与其说是 Box但是dyn这允许您拥有动态类型而不是静态类型(只是 Box 可以容纳未调整大小的类型)。

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

推断你的例子:

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因为这是一个绑定(bind),而不是类型。而且不可能是dyn RxToken + 'a因为unsized rvalues尚不支持。

如果您需要使用dyn Device<'_>以完全动态的方式,您不能拥有关联的类型。如果你还想拥有一些RxTokenTxToken是动态的,你需要更多的动态,例如:

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

关于rust - 当 `Box<dyn MyTrait>` 具有参数化类型时,如何保存 `MyTrait` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62508010/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com