generics - 如何为 Rust 泛型函数中绑定(bind)的大小多类型赋予可重用名称

标签 generics rust

<分区>

取下面的代码

fn do_stuff<T: ?Sized + io::Write + io::Read>(mut serial: Box<T>) {
  // stuff
}

例如,它可以使用一个串行设备,或者一个用于测试目的的文件。这行得通,但编写该类型绑定(bind)的情况非常少。

如何为可以在其他函数中重用的边界命名?使用(根据 Is there any way to create a type alias for multiple traits? )

trait IoDev : io::Write + io::Read {}
impl<T: io::Write + io::Read> IoDev for T {}

部分解决了问题,因为不再需要重复 Write+Read,但我仍然需要在每个函数上重复 ?Sized。有没有办法避免重复这种情况?

最佳答案

您的问题可能是特征不会自动实现。即使类型满足特征的所有先决条件,您也必须手动为其编写 impl。编译器不会自动执行此操作,因为实现特征可能会赋予它一些新的含义。

例如,std::iter::FusedIterator 特性没有方法或关联类型,唯一的要求是实现类型是Iterator。编译器不能自动实现它,因为它具有特殊含义,程序员必须决定是否应该为他们的特定迭代器实现它。

如果你想为每个满足条件的类型实现你的特征,你可以做一个全面的实现:

trait IoDev : io::Write + io::Read {}

impl<T: io::Write + io::Read> IoDev for T {}

关于generics - 如何为 Rust 泛型函数中绑定(bind)的大小多类型赋予可重用名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56786387/

相关文章:

rust - 有没有一种方法可以以相同顺序随机排列两个或多个列表?

java - 如何在抽象父类(super class)中定义泛型列表?

Delphi泛型嵌套类

c# - 通过将另一个属性与不同列表进行比较来从源列表中选择 ID

rust - 如何给模块取一个不同于 crate 的名字

rust - 将 char 附加到使用rust 的字符串

rust - 省略 'NaN' 值的 f32::NAN rust 闭包的值

c# - 如何组合两个通用方法

c# - 什么时候在 C# 中解析泛型类型?

iterator - 切片迭代器能否在恒定时间内前进多个元素?