如何使用稳定的Rust实现以下(伪Rust)?
pub fn read<T: Read>(stream: T) {
let stream = if T implements BufRead {
stream
} else {
BufReader::new(stream)
};
// Work with `stream`
}
我知道impl specialization,但我想用稳定的Rust实现同样的目标。
答案 0 :(得分:4)
你没有。 RFC存在的完整原因是因为之前无法实现的!
作为“证据”,请考虑str::to_string
。在存在专门化之前,str::to_string
使用与ToString
的所有其他实现者完全相同的机制,这意味着它必须构建并使用格式化基础结构。这是相对昂贵的,并且积极地基准showed the difference between str::to_string
and str::to_owned
or String::from
。启用专业化后,Rust编译器将其用于str::to_string
,并且基准测试得到了改进。
如果 Rust编译器在专门化之前无法专门化,那么非常不可能其他代码可以找到某种方式以通用的方式解决它。
对于您的具体情况,我同意您应该接受实施BufRead
(fn read<T: BufRead>(stream: T)
)的内容。
答案 1 :(得分:4)
就纯锈而言,有困难:
话虽如此,还有诸如query_interfaces
箱子之类的替代品可以促进原则性的降级。
实质上,您希望让调用者告诉您是否为相关流实现了BufRead
。可以创建query_interfaces
或专用的解决方案来发送“可选的”v-pointers。
但是,我只需要BufRead
来实施stream
。如果需要,来电者可以随身携带stream
BufRead::new
。