rust - 如何持有一个`盒子` 当 `MyTrait` 有参数化类型时?
问题描述
我需要为运行时选择保留一个选项Box<Device>
:
device: Option<Box<dyn Device<'a>>>
但该Device
特征具有相关类型:
pub trait Device<'a> {
type RxToken: RxToken + 'a;
type TxToken: TxToken + 'a;
我越来越
必须指定关联类型的值
RxToken
(来自 traitvirtual_tun::smoltcp::phy::Device
),TxToken
(来自 trait )virtual_tun::smoltcp::phy::Device
如果它们在一个盒子里,为什么我需要指定这些类型?Device
我存储在其中的任何实现对象Box
都已经拥有RxToken
并被TxToken
选中。我认为没有理由必须指定它。
在这种情况下我能做什么?
解决方案
它不是那么多,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,则不能有关联的类型。如果您仍然想拥有一些RxToken
并TxToken
保持活力,则需要更多的动力,例如:
trait Device<'a> {
fn read(&self) -> Box<dyn RxToken>;
fn write(&self) -> Box<dyn TxToken>;
}
推荐阅读
- rabbitmq - 想要发布到远程机器上的消息队列
- docker - 如何将本地文件系统复制到 Docker 容器中
- python - 尝试使用 pip 安装 pyliblo 会导致错误 D8021 invalid numeric argument '/Werror-implicit-function-declaration'
- regex - Nginx 重写规则从请求的 url 重定向到特定的 url
- angular7 - 在 ag-grid 中显示图像
- machine-learning - 是否可以在无监督学习中使用分组的数据行对数据进行聚类?
- c# - POST 请求在 ASP 中不起作用,没有任何反应
- java - DataOutputStream:dos.write() in loop,Receiver只接收一个数据包
- azure - 如何从 http 触发的逻辑应用程序中解析 xml?
- excel - 通过父子程序的错误处理取消子子程序