我试图获得一个动态可调度的借用实现两个Reader和的对象的实例Seek.
据我所知,只要涉及一个特征,Rust就可以进行动态调度.
use std::io::{Read, Seek};
fn user(stream: &mut Read) {}
Run Code Online (Sandbox Code Playgroud)
但是,有两个或更多特征边界,我被迫使用类型参数:
fn user_gen<T: Read + Seek>(stream: &mut T) {}
Run Code Online (Sandbox Code Playgroud)
由于下面的实际类型是构建器,它必须以某种方式存储借用的对象,并且使用类型参数将使实现更复杂(我已经有三个类型参数).
理想情况下,我可以做这样的事情:
fn user_dynamic(stream: &mut (Read + Seek)) {}
Run Code Online (Sandbox Code Playgroud)
这不编译:
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
Run Code Online (Sandbox Code Playgroud)
我知道动态调度是通过胖指针完成的,通常它们只引用一个方法表,而不是多个方法表.我还没有看到过支持这种语言的静态编译语言,但这样的功能对我有很大帮助.
oli*_*obk 13
您可以创建一个合并这两个特征的空特征:
use std::io::{Read, Seek};
trait SeekRead: Seek + Read {}
impl<T: Seek + Read> SeekRead for T {}
fn user_dynamic(stream: &mut SeekRead) {}
Run Code Online (Sandbox Code Playgroud)
这将创建一个新的V SeekRead同时包含的所有函数指针Seek和Read.
您将无法投你&mut SeekRead要么&mut Seek还是&mut Read没有一些挂羊头卖狗肉(见为什么不生锈特性的支持对象向上转型?)
| 归档时间: |
|
| 查看次数: |
789 次 |
| 最近记录: |