Generics 在专业化稳定之前,如何在稳定的渠道上进行专业化?

Generics 在专业化稳定之前,如何在稳定的渠道上进行专业化?,generics,rust,Generics,Rust,如何通过稳定锈蚀实现以下(伪锈蚀) pub fn read<T: Read>(stream: T) { let stream = if T implements BufRead { stream } else { BufReader::new(stream) }; // Work with `stream` } pub-fn-read(流:T){ let stream=如果T实现BufRead{ 流动 }否则{ Bu

如何通过稳定锈蚀实现以下(伪锈蚀)

pub fn read<T: Read>(stream: T) {
    let stream = if T implements BufRead {
        stream
    } else {
        BufReader::new(stream)
    };

    // Work with `stream`
}
pub-fn-read(流:T){
let stream=如果T实现BufRead{
流动
}否则{
BufReader::新建(流)
};
//与“流”一起工作`
}

我知道,但是我想用稳定的铁锈达到同样的效果。

你不知道。RFC存在的全部原因是因为以前不可能

作为“证明”,请考虑<代码> STR::toSype 。在专业化出现之前,

str::to_string
使用了与
ToString
的所有其他实现者完全相同的机制,这意味着它必须建立和使用格式化基础结构。这是相对昂贵和积极的基准。启用专门化后,Rust编译器将其用于
str::to_string
,基准测试也得到了改进

如果Rust编译器不能在专门化之前进行专门化,那么其他代码就不太可能找到某种方法以通用方式解决它



对于您的具体情况,我同意您应该只接受实现
BufRead
fn read(stream:T)
)的东西。

就纯锈而言,很难:

  • Stable没有专门化
  • 铁锈不会使铸件脱落
这就是说,有一些替代品,如板条箱,可以促进有原则的向下浇铸

本质上,您希望让调用者告诉您是否为相关流实现了
BufRead
<可以创建代码>查询接口或专用解决方案来提供“可选”v指针

然而,我只需要
BufRead
通过
stream
实现。如果需要,调用者总是可以使用
BufRead::new
包装他们的