如何实现定义新公共类型并返回该类型实例的宏?答案 |
您所在的位置:网站首页 › 给即将中考的孩子写一封信要怎么写 › 如何实现定义新公共类型并返回该类型实例的宏?答案 |
泛型需要大量样板 use std::collections::HashMap; use core::hash::Hash; use std::ops::AddAssign; struct YtzU64 { table: HashMap } impl YtzU64 { pub fn new() -> Self { Self { table: HashMap::new() } } pub fn add(&mut self, item: &T) { if let Some(item) = self.table.get_mut(item) { *item += *item; } else { self.table.insert(*item, *item); } } pub fn largest(&self) -> Option { let mut values = self.table.values(); let mut largest:Option = values.next().map(|t| *t); for v in values { if largest < Some(*v) { largest = Some(*v); } } largest } } fn main() { let mut y = YtzU64::new(); y.add(&71); y.add(&25); y.add(&25); y.add(&25); y.add(&34); println!("{}", y.largest().unwrap()); }我对您的宏的翻译需要的样板文件比您的宏要少。它少了两个缩进,少了 4 行(macro_rules!,顶部的模式匹配,末尾的两个右大括号)。请注意,我稍微更改了 api,因为 largest 现在返回一个 Option,以匹配 std::iter::Iterator::max()。另请注意,您的 api 设计仅限于T:Copy。如果您想支持T: ?Copy + Clone 或T: ?Copy + ?Clone,则必须对其进行一些重新设计。 特征狩猎 编译器是你的朋友。观察当我删除一个特征边界时会发生什么 error[E0277]: the trait bound `T: std::hash::Hash` is not satisfied ...使用宏是一个有趣的练习,但使用宏重新实现泛型没有用。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |