Rust 如何创建对各种整数类型通用的is_素数函数?
我刚刚深入了解了Rust,并想制作一些通用的基本数学函数。我有以下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
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();