我试图以动态可调度方式借用到同时实现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
我了解动态分配是通过胖指针完成的,通常这些指针仅引用一个方法表,而不是多个方法表。我还没有看到可以支持此功能的静态编译语言,但是这种功能对我有很大帮助。
您可以创建一个合并这两个特征的空特征:
use std::io::{Read, Seek};
trait SeekRead: Seek + Read {}
impl<T: Seek + Read> SeekRead for T {}
fn user_dynamic(stream: &mut SeekRead) {}
针对这将创建一个新的VSeekRead
同时包含的所有函数指针Seek
和Read
。
您将无法投你&mut SeekRead
要么&mut Seek
还是&mut Read
没有一些挂羊头卖狗肉(见为什么不生锈特性的支持对象向上转型?)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句