使用特征和`match`的通用数值函数>> [

问题描述 投票:-1回答:2
[我正在尝试建立一个通用的格式化函数,该函数使用两个整数T作为分母和分母,并根据一些简单规则格式化小数。

我看过num特性,但是仍然无法使其有效。我已经有了比我想要的还要冗长的代码,因此我认为是时候寻求帮助了。

extern crate num; use num::{Integer,FromPrimitive}; fn format_rational<T>(n: T, d: T) -> String where T: Integer + FromPrimitive + fmt::Display { let one: T = FromPrimitive::from_u16(1).unwrap(); let ten: T = FromPrimitive::from_u16(10).unwrap(); let hun: T = FromPrimitive::from_u16(100).unwrap(); let tho: T = FromPrimitive::from_u16(1000).unwrap(); let precision = match d { one => Some(1), hun => Some(2), tho => Some(3), _ => None, }; match precision { Some(p) => format!("{:.*}", p, n as f32 / d as f32), None => format!("{} / {}", n, d), } }

此错误与

non-primitive cast: `T` as `f32`

但是当我将第一条format!行更改为]时>

Some(p) => format!("{:.*}", p, f32::from(n) / f32::from(d))

我收到此错误:

the trait bound `f32: std::convert::From<T>` is not satisfied

我将其解释为“对于f32类型,不存在From”,这是有道理的。当特征为f32时,如何表示Num,这意味着Eq,这意味着它应排除浮点数? (因为浮动仅实现PartialEq)。最后,有没有一种方法可以简单地使用From<T>

我想念的是什么?还是可以通过另一种(更轻松的)方式解决问题?谢谢!

我正在尝试构建一个通用的格式化函数,该函数使用两个整数T作为分母和分母,并根据一些简单规则格式化小数。我看了一下num trait,...

generics rust traits
2个回答
0
投票
我今天解决了。有更好的方法吗?

extern crate num; use std::fmt; use num::{ToPrimitive}; pub fn format_rational<T>(n: T, d: T) -> String where T: ToPrimitive + fmt::Display { let precision = match d.to_usize().unwrap() { 1 | 10 => Some(1), 100 => Some(2), 1000 => Some(3), _ => None, }; match precision { Some(p) => format!("{:.*}", p, ToPrimitive::to_f32(&n).unwrap() / ToPrimitive::to_f32(&d).unwrap()), None => format!("{} / {}", n, d), } }


0
投票
与您的答案相比,避免了一些unwrap
© www.soinside.com 2019 - 2024. All rights reserved.