如何实现定义新公共类型并返回该类型实例的宏?答案

您所在的位置:网站首页 给即将中考的孩子写一封信要怎么写 如何实现定义新公共类型并返回该类型实例的宏?答案

如何实现定义新公共类型并返回该类型实例的宏?答案

2023-04-13 01:06| 来源: 网络整理| 查看: 265

泛型需要大量样板

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