【问题标题】:Struct with integer or float具有整数或浮点数的结构
【发布时间】:2021-04-29 18:20:47
【问题描述】:

我是 Rust 的新手,目前正在阅读有关结构的内容。下面的代码只是我的一个简单测试,我想知道如何允许任何数值作为 Circle 结构的属性r。我希望它能够存储整数或浮点数。

我会假设重载但不确定。另外,从我在网上搜索的内容来看,有一些板条箱 numnum-traits 但我不确定如何使用它们,除非我错过了 doscs 部分。

use std::f64::consts::PI;

trait Area {
    fn calculate_area(self) -> f64;
}

struct Circle {
    r:f64
}

impl Area for Circle {
    fn calculate_area(self) -> f64 { 
        PI * self.r * self.r
    }
}

fn main() {

    let c = Circle { r: 2.5 };

    println!("The area is {}", c.calculate_area())
    
}

我更喜欢一个解决方案,而不必包含另一个板条箱。

【问题讨论】:

    标签: rust


    【解决方案1】:

    使用num_traits crate 非常简单:

    use num_traits::{FromPrimitive, Num};
    use std::f64::consts::PI;
    
    trait Area<T>
    where
        T: Num + FromPrimitive + Copy,
    {
        fn calculate_area(self) -> T;
    }
    
    struct Circle<T>
    where
        T: Num + FromPrimitive + Copy,
    {
        r: T,
    }
    
    impl<T> Area<T> for Circle<T>
    where
        T: Num + FromPrimitive + Copy,
    {
        fn calculate_area(self) -> T {
            T::from_f64(PI).unwrap() * self.r * self.r
        }
    }
    
    fn main() {
        let c = Circle { r: 2.5 };
    
        println!("Float: The area is {}", c.calculate_area());
    
        let ci = Circle { r: 3 };
    
        println!("Integer: The (approxmiate) area is {}", ci.calculate_area());
    }
    

    【讨论】:

    • 我什至会将Arena&lt;T&gt; 中的T 设为关联类型:对于任何给定类型,您都将拥有Arena 的一个实现。另外,您可以使用FloatConst trait 直接使用T::PI
    • T::from_f64(PI) 的使用有点可疑,因为它可能会导致结果偏离T 的精度很多(例如,9π 比 27 更接近 28) .但在这种情况下,“正确”的行为应该是什么还不是很清楚,所以 shrug
    猜你喜欢
    • 1970-01-01
    • 2013-09-14
    • 2019-01-21
    • 1970-01-01
    • 2018-09-23
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多