Rust 我可以在不使用泛型类型的情况下获取多trait实例的trait对象吗?

Rust 我可以在不使用泛型类型的情况下获取多trait实例的trait对象吗?,rust,Rust,我正在尝试获取一个动态可调度的借阅对象实例,该对象实现了Reader和Seek 我知道Rust可以进行动态调度,只要只涉及一种特性 use std::io::{Read, Seek}; fn user(stream: &mut Read) {} 但是,对于两个或多个trait边界,我不得不使用一个类型参数: fn user_gen<T: Read + Seek>(stream: &mut T) {} 这不会编译: error[E0225]:只有自动特征可以用作特征

我正在尝试获取一个动态可调度的借阅对象实例,该对象实现了
Reader
Seek

我知道Rust可以进行动态调度,只要只涉及一种特性

use std::io::{Read, Seek};
fn user(stream: &mut Read) {}
但是,对于两个或多个trait边界,我不得不使用一个类型参数:

fn user_gen<T: Read + Seek>(stream: &mut T) {}
这不会编译:

error[E0225]:只有自动特征可以用作特征对象中的附加特征
-->src/main.rs:3:38
|
3 | fn用户_动态(流:&mut(读取+查找)){}
|^^^^非自动附加特征

我知道动态调度是通过fat指针完成的,通常这些指针只引用一个方法表,而不是多个方法表。我还没有看到一种静态编译的语言能够支持这一点,但是这样的功能会对我有很大帮助。

您可以创建一个空的trait来合并这两个trait:

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

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

fn user_dynamic(stream: &mut SeekRead) {}
使用std::io::{Read,Seek};
trait SeekRead:Seek+Read{}
T{}的impl SeekRead
fn用户_动态(流:&mut SeekRead){}
这将为
SeekRead
创建一个新的vtable,其中包含
Seek
Read
的所有函数指针

如果没有一些技巧,您将无法将
&mut SeekRead
转换为
&mut Seek
&mut Read
(请参阅)

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

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

fn user_dynamic(stream: &mut SeekRead) {}