如何让Rust的between函数支持多种数值类型参数?
基于Rust泛型实现多数值类型的范围判断函数
你可以通过泛型+Trait约束来实现支持多种数值类型的范围判断函数,无需使用枚举重复代码,直接在函数定义头部声明支持的类型约束即可。
方案一:支持跨类型直接比较
利用Rust标准库的PartialOrd trait,允许不同数值类型之间直接比较(比如f64和i32),函数定义如下:
pub fn between<T, U>(num: T, min: U, max: U) -> bool where T: PartialOrd<U>, { num > min && num < max }
示例用法
// 整数与整数 assert!(between(5, 1, 10)); // 浮点数与整数 assert!(between(3.5, 2, 5)); // 无符号整数与有符号整数 assert!(between(10u64, 5i32, 15i32)); // 浮点数与浮点数 assert!(!between(6.2, 1.5, 4.0));
方案二:统一类型后比较
如果希望先将min和max转换为与num相同的类型再比较,可以使用Into trait约束,确保类型转换的安全性:
pub fn between<T, U>(num: T, min: U, max: U) -> bool where U: Into<T>, T: PartialOrd, { let min_converted = min.into(); let max_converted = max.into(); num > min_converted && num < max_converted }
示例用法
// i32转f64后比较 assert!(between(4.8, 2i32, 6i32)); // u32转i64后比较 assert!(between(100i64, 50u32, 150u32));
为什么不用枚举?
枚举方案需要为每个支持的类型编写分支逻辑,代码冗余且扩展性差。而泛型+Trait的方式可以直接复用逻辑,只要类型满足对应的Trait约束(比如支持比较、支持转换),就能自动适配,符合Rust的"零成本抽象"设计理念。
内容的提问来源于stack exchange,提问作者rnso
相关产品推荐
相关产品推荐

