文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
8.3.3 泛型
定义通用泛型模板,由此衍生出多个特征。
use std::ops::Add; trait Double<T> where // 特征模板化,最终实现多个特征类型。 T: Copy + Add<Output = T> { fn to(&self, x: &T) -> T { *x + *x } } /* ------------------------------------------------------ */ struct Data; impl Double<i32> for Data {} // 变向实现重载(overload)。 impl Double<f32> for Data {} fn main() { let d = Data; assert_eq!(d.to(&10), 20); assert_eq!(d.to(&1.1), 2.2); }
可指定默认类型。
trait Double<T = i32> where T: Copy + Add<Output = T> { fn to(&self, x: &T) -> T { *x + *x } } impl Double for Data {} // 使用默认类型。
当然,还可组合两套泛型模板,形成一套新的模板,同时提供类型和特征实现。
use std::ops::Add; trait Double<T> where T: Copy + Add<Output = T> { fn to(&self, x: &T) -> T { *x + *x } } /* ------------------------------------------------------ */ #[derive(Debug)] struct Data<T> { x: T } impl<T> Double<T> for Data<T> where T: Copy + Add<Output = T> { }
甚至于直接为 “空白” 的 T 实现(generic blanket impls),任何符合约束条件的类型都自动实现该特征。
use std::ops::Add; trait Double<T> where T: Copy + Add<Output = T> { fn to(&self, x: &T) -> T { *x + *x } } impl<T> Double<T> for T where T: Copy + Add<Output = T> { } /* ------------------------------------------------------ */ fn main() { assert_eq!(1.to(&10), 20); assert_eq!(1.0.to(&1.1), 2.2); }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论