Rust标准库是否有Min/Max特性?

b91juud3  于 2023-10-20  发布在  其他
关注(0)|答案(3)|浏览(138)

我想初始化一个T类型的变量,它的最小值是T::min()。在Rust 1.40.0中不需要外部依赖是可能的吗?
另一种方法是将变量设置为None,但这会在每次想要递增变量时引入None检查的开销。

dpiehjr4

dpiehjr41#

在标准库中没有这样的特性。
然而,如果你愿意为你感兴趣的类型创建适当的trait并实现它们,那么对于没有外部依赖的任意类型,有可能有一个通用的min和max概念,例如:

use core::fmt::Display;

trait Min {
    fn min() -> Self;
}

trait Max {
    fn max() -> Self;
}

impl Min for u8 {
    fn min() -> u8 {
        std::u8::MIN
    }
}

impl Max for u8 {
    fn max() -> u8 {
        std::u8::MAX
    }
}

impl Min for i32 {
    fn min() -> i32 {
        std::i32::MIN
    }
}

impl Max for i32 {
    fn max() -> i32 {
        std::i32::MAX
    }
}

fn print_min_max<T: Min + Max + Display>() {
    println!("{} -> {}", T::min(), T::max());
}

fn main() {
    let m: i32 = Min::min();
    println!("{}", m);

    print_min_max::<u8>();
    print_min_max::<i32>();
}

这将打印:

-2147483648
0 -> 255
-2147483648 -> 2147483647

Playground

iqjalb3h

iqjalb3h2#

现代Rust中的一个解决方案可以如下定义trait:

trait MyTrait {
     const MIN: Self;
}

impl MyTrait for u8 {
    const MIN: u8 = 42u8;
}

fn print_min<T: MyTrait + Display>() {
   println!("Value is {}", T::MIN);
}

print_min::<u8>();

Playground

nuypyhwy

nuypyhwy3#

这个问题说“没有外部依赖”,所以仅出于完整性的原因:

use num::traits::bounds::Bounded;

pub fn print_min<T: Bounded + std::fmt::Display>() {
    println!("minimum: {}", T::min_value());
}

print_min::<u8>();

(You当然可以将trait和实现复制到您自己的项目中,因为它相当琐碎。)

相关问题