Rust 如何创建对各种整数类型通用的is_素数函数?

Rust 如何创建对各种整数类型通用的is_素数函数?,rust,traits,Rust,Traits,我刚刚深入了解了Rust,并想制作一些通用的基本数学函数。我有以下is_prime功能: fn is_prime(n: i64) -> bool { if n == 2 || n == 3 { return true; } else if n % 2 == 0 || n % 3 == 0 { return false; } let mut i = 5i64; let mut w = 2i64; while i

我刚刚深入了解了Rust,并想制作一些通用的基本数学函数。我有以下
is_prime
功能:

fn is_prime(n: i64) -> bool {
    if n == 2 || n == 3 {
        return true;
    } else if n % 2 == 0 || n % 3 == 0 {
        return false;
    }

    let mut i = 5i64;
    let mut w = 2i64;
    while i*i <= n {
        if n % i == 0 {
            return false;
        }
        i += w;
        w = 6 - w;
    }
    true
}
fn是素数(n:i64)->bool{
如果n==2 | | n==3{
返回true;
}如果n%2==0 | | n%3==0,则为else{
返回false;
}
设muti=5i64;
设mut w=2i64;

虽然i*i泛型数字类型的使用可能会非常麻烦,但一旦掌握了它们的窍门,它们就不会太糟糕,尽管有点冗长。此类方法的标准构建块是from crates.io中的特性,最明显的是,和,以及标准库的特性

数字文本不能泛型于任何数字类型;它们必须通过trait方法调用来完成;并且对于这里的大多数目的来说,我们需要的数字是0、1、2、3、5和6,这是可以通过这些构建块实现的。您还可以使用生成这些值的静态方法来创建自己的trait并实现它适用于任何您喜欢的数字类型,但使用
Num
所保证的内容进行操作是一个更好的主意

基本过程是指定泛型类型参数基于
Num
(和
PartialOrd
,如果您对该类型的值编写不等式,例如
i*i bool{
设_0=N::zero();
设_1=N::one();
设2=1+1;
设3=2+1;
设5=2+3;
设6=3+3;
如果n==_2 | | n==_3{
返回true;
}如果n%\u 2==\u 0 | n%\u 3==\u 0{
返回false;
}
设muti=_5;
设mut w=_2;

虽然我*i要添加到Chris Morgan的答案中,但您可以使用
num::NumCast::from
转换为通用数字类型,其中使用
0
1
是不合适的。在您的情况下:

use num::{Num, NumCast};

fn is_prime<N: Num + Ord + NumCast + Copy>(n: N) -> bool {
    let _0: N = NumCast::from(0usize).unwrap();
    let _1: N = NumCast::from(1usize).unwrap();
    let _2: N = NumCast::from(2usize).unwrap();
    let _3: N = NumCast::from(3usize).unwrap();
    let _4: N = NumCast::from(4usize).unwrap();
    let _5: N = NumCast::from(5usize).unwrap();
    let _6: N = NumCast::from(6usize).unwrap();
使用num::{num,NumCast};
fn是素数(n:n)->bool{
让_0:N=NumCast::from(0usize).unwrap();
让_1:N=NumCast::from(1usize).unwrap();
让_2:N=NumCast::from(2usize).unwrap();
让_3:N=NumCast::from(3usize).unwrap();
让_4:N=NumCast::from(4usize).unwrap();
让_5:N=NumCast::from(5usize).unwrap();
让_6:N=NumCast::from(6usize).unwrap();

除了使用
Num
特性作为约束外,还可以使用实际需要的基本特性:
N:PartialEq+PartialOrd+Add+Sub+Mul+Rem+One+Zero
Num
只是一个方便的快捷方式。
use num::{Num, NumCast};

fn is_prime<N: Num + Ord + NumCast + Copy>(n: N) -> bool {
    let _0: N = NumCast::from(0usize).unwrap();
    let _1: N = NumCast::from(1usize).unwrap();
    let _2: N = NumCast::from(2usize).unwrap();
    let _3: N = NumCast::from(3usize).unwrap();
    let _4: N = NumCast::from(4usize).unwrap();
    let _5: N = NumCast::from(5usize).unwrap();
    let _6: N = NumCast::from(6usize).unwrap();