如何在专业化稳定之前专注于稳定的渠道?

时间:2017-01-29 12:31:12

标签: generics rust

如何使用稳定的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实现同样的目标。

2 个答案:

答案 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编译器在专门化之前无法专门化,那么非常不可能其他代码可以找到某种方式以通用的方式解决它。

对于您的具体情况,我同意您应该接受实施BufReadfn read<T: BufRead>(stream: T))的内容。

答案 1 :(得分:4)

就纯锈而言,有困难:

  • 稳定没有专业化
  • Rust没有向下投射

话虽如此,还有诸如query_interfaces箱子之类的替代品可以促进原则性的降级。

实质上,您希望让调用者告诉您是否为相关流实现了BufRead。可以创建query_interfaces或专用的解决方案来发送“可选的”v-pointers。

但是,我只需要BufRead来实施stream。如果需要,来电者可以随身携带stream BufRead::new