我刚刚深入了解了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
}

我需要怎样才能通过isizei64usize等作为论点?我已经阅读了主页上的Rust guide条,但我不确定如何将trait 的概念应用到我的目标中.

推荐答案

使用泛型数字类型可能会很麻烦,但一旦你掌握了它们的窍门,它们也不会太糟糕,尽管会更详细一些.这种方法的标准构件是the num crate个 crate 中的特征.io,最著名的是NumZeroOne,以及标准库的std::cmp::PartialOrd.

数字文本不能是任何数字类型的通用文本;它们必须通过trait方法调用来完成;Zero::zero()One::one()就足以满足这里的大多数目的,我们想要的数字是0、1、2、3、5和6,这是用这些积木可以实现的.你也可以用产生这些值的静态方法来创建你自己的特性,并为你喜欢的任何数字类型实现它,但是用Num保证的方法来实现它是一个更好的主意.

基本过程是将泛型类型参数指定为基于Num(如果您对该类型的值编写不等式,如i * i <= n,则为PartialOrd),并将任何数字文字替换为由0和1构成的文字,如下面方法开头的六条let语句所示.这通常就足够了.

以下是这种特殊方法的最终结果:

// You’ll also need the appropriate dependencies.num addition to Cargo.toml
extern crate num;

use num::Num;

fn is_prime<N: Num + PartialOrd + Copy>(n: N) -> bool {
    let _0 = N::zero();
    let _1 = N::one();
    let _2 = _1 + _1;
    let _3 = _2 + _1;
    let _5 = _2 + _3;
    let _6 = _3 + _3;
    if n == _2 || n == _3 {
        return true;
    } else if n % _2 == _0 || n % _3 == _0 {
        return false;
    }

    let mut i = _5;
    let mut w = _2;
    while i * i <= n {
        if n % i == _0 {
            return false;
        }
        i = i + w;
        w = _6 - w;
    }
    true
}

Rust相关问答推荐

SQL x中的mut *transaction和mut transaction有什么区别?

为什么迭代器上的`. map(...)`的返回类型如此复杂?

如何访问Rust存储值的内存地址

展开枚举变量并返回所属值或引用

为什么`Vec i64`的和不知道是`Option i64`?

这是不是在不造成嵌套的情况下从枚举中取出想要的变体的惯用方法?

有没有办法指定只在Rust的测试中有效的断言?

铁 rust 中的泛型:不能将`<;T作为添加>;::Output`除以`{Float}`

在我的Cargo 中,当我在建筑物中使用时,找不到我可以在产品包中使用的 crate .r我如何解决这个问题?

习语选项<;T>;到选项<;U>;当T->;U用From定义

如何在 Rust 中编写一个通用方法,它可以接受任何可以转换为另一个值的值?

`use` 和 `crate` 关键字在 Rust 项目中效果不佳

当锁被释放时,将锁包装到作用域中是否会发生变化?

全面的 Rust Ch.16.2 - 使用捕获和 const 表达式的 struct 模式匹配

使用在功能标志后面导入的类型,即使未启用功能标志

按下 Ctrl + C 时优雅地停止命令并退出进程

仅当函数写为闭包时才会出现生命周期错误

如何连接 Rust 中的相邻切片

If let expression within .iter().any

Rust:如果我知道只有一个实例,那么将可变borrow 转换为指针并返回(以安抚borrow 判断器)是否安全?