是否可以在不使用泛型类型的情况下获得多特征实例的特征对象?

拜伦

我试图以动态可调度方式借用到同时实现Reader的对象的实例Seek

我了解只要只要涉及一个特征,Rust就可以进行动态调度。

use std::io::{Read, Seek};
fn user(stream: &mut Read) {}

尽管具有两个或多个特征范围,但我不得不使用类型参数:

fn user_gen<T: Read + Seek>(stream: &mut T) {}

由于下面的实际类型是生成器,因此它必须以某种方式存储借用的对象,为此使用类型参数会使实现更加复杂(我已经拥有三个类型参数)。

理想情况下,我将能够执行以下操作:

fn user_dynamic(stream: &mut (Read + Seek)) {}

这不会编译:

error[E0225]: only auto traits can be used as additional traits in a trait object
 --> src/main.rs:3:38
  |
3 | fn user_dynamic(stream: &mut (Read + Seek)) {}
  |                                      ^^^^ non-auto additional trait

我了解动态分配是通过胖指针完成的,通常这些指针仅引用一个方法表,而不是多个方法表。我还没有看到可以支持此功能的静态编译语言,但是这种功能对我有很大帮助。

oli_obk

您可以创建一个合并这两个特征的空特征:

use std::io::{Read, Seek};

trait SeekRead: Seek + Read {}
impl<T: Seek + Read> SeekRead for T {}

fn user_dynamic(stream: &mut SeekRead) {}

针对这将创建一个新的VSeekRead同时包含的所有函数指针SeekRead

您将无法投你&mut SeekRead要么&mut Seek还是&mut Read没有一些挂羊头卖狗肉(见为什么不生锈特性的支持对象向上转型?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不使用Delphi约束的情况下确定泛型类型是否为nil?

在结构中使用泛型并通过特征实现

是否可以为特征提供可选的泛型类型?

是否可以在不编写自定义特征类的情况下对类型进行模式匹配?

是否可以在不定义泛型的情况下使用泛型对类进行子类化?

如何检查泛型类型是否实现了泛型特征?

使用泛型加强Scala特征的类型

为什么可以在不指定泛型类型参数的情况下实例化泛型类

Golang 不能在没有实例化的情况下使用泛型类型

在非泛型结构上调用特定特征实现

在不考虑泛型类型参数的情况下检查类型是否实现了泛型接口

如何在不使用或getClass()实例的情况下检查对象的类型

是否可以指定一个超特征,使其在其类型参数上是泛型的?

在不使用克隆特征的情况下从集合中获取价值

标量自我类型特征实例化

Java泛型:如何在不使用原始类型的情况下强制转换为(T扩展Comparable <?super T>)

是否可以在不使用返回类型的情况下连接两个int数组?

是否可以在不使用“永久许可”类型的情况下允许离线播放?

在特征对象中使用泛型类型参数会引起什么问题?

特征是否可以返回由特征上的通用类型指定的特征对象?

是否可以在不使用对象或数组的情况下显示:none 查询列表?

是否可以在不使用“ tuple()”的情况下将生成器对象转换为元组?

Java Quicksort-是否可以在不使用比较器的情况下比较对象?

是否可以在不使用Eq的情况下使用==和/ =?

是否可以在不使用MFC的情况下使用CListCtrl

是否可以覆盖Rust中的默认特征实现?

是否可以在不使用循环的情况下找到控件?

是否可以在不使用 UIBezierPath 的情况下绘制虚线

是否可以在不使用Composer的情况下安装Laravel?