如何在Rust中将Ratio转换< T >为float(以与类型边界兼容的方式)

yqkkidmi  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(106)

假设你想在Rust中将Ratio< isize >转换为f64,e.g的。

use num::rational::Ratio;

pub fn foo() {
    let a = Ratio::new(1,1);
    let b = < cast a to f64 >;
}

最好的办法是什么?理想情况下,它应该是一个trait方法,以便与类型边界兼容。

为什么这不是显而易见的

对于许多有经验的Rust用户来说,解决方案可能是显而易见的,但在文档中很难找到。例如,在板条箱上运行f64的文本搜索。num::rational::Ratio的离子寻呼不产生命中。搜索float只返回从浮点转换为有理数的方法,反之亦然。初学者还可能搜索FromInto的实现,结果显示为空。最后,网络搜索并没有找到一个令人满意的答案,聊天GPT也没有。例如,其中一个最热门的命中只是定义了一个函数destructure并转换为浮点数。这并不是说你不可能找到答案,但如果你运气不好,你可能会花更多的时间去寻找。

tktrz96b

tktrz96b1#

方案一(通用)

更新以突出显示其中一条注解: www.example.com 。这种解决方案可以在更广泛的背景下使用。

溶液2(特定)

正如git仓库的issues中所指出的,有一个trait ToPrimitive提供了所需的功能:

use num::{rational::Ratio, ToPrimitive};

pub fn foo() {
    let a = Ratio::new(1,1);
    let b: Option< f64 > = a.to_f64();
}

这对边界很好:

use num::{rational::Ratio, ToPrimitive};

struct MakeFloats< T: ToPrimitive >(T);

impl < T: ToPrimitive > MakeFloats< T > {
    fn make_float(&self) -> f64 {
        self.0.to_f64().unwrap()
    }
}

fn main() {
    let a: Ratio<i64> = Ratio::new(1,1);
    let b = MakeFloats(a);
}

相关问题