未能在阶乘函数中解析为 Rust 中的特征

failing to resolve as Trait in Rust in a factorial function

以防 reader 不知道阶乘函数被编写为采用 u64 类型,我正在尝试使用 BigUint 而不是通过阶乘函数获得更大的数字。

我正在尝试将整数转换为 Rust 中的 BigUint 这是我正在尝试更改的代码:

pub fn factorial_iterative(n: u64) -> u64 {
    (1..n+1).fold(1, |p, n| p*n)
}

我一直在关注 Rust 方便的自动更正功能,我想出了这个:

extern crate num;
use num::BigUint;

pub fn factorial_iterative(n: BigUint) -> BigUint {
    (1..n+1).fold(1 as <num::BigUint as Trait>::to_u64, |p, n| p*n)
}

但现在它向我抛出错误:failed to resolve use of undeclared type or module Trait

我需要添加或更改什么才能使这项工作正常进行?

获得 1 的正确方法是

use num::BigUint;
use num::One;

pub fn factorial_iterative(n: u64) -> BigUint {
    (1..=n).fold(BigUint::one(), |p, n| p*n)
}

你不能用 BigUint 做范围,所以你必须使用 u64 范围。您可以使用 ..= 来获取包含范围。use crate::num::One; 需要使用 ::one() 因为它在需要在范围内的 One 特性中实现。

@Unlikus 差一点就答对了。我能够更正该功能的方法是:

use num::one;
use num::{BigUint, One};

pub fn factorial_iterative(n: BigUint) -> BigUint {
    (one()..n+one()).fold(BigUint::one(), |p, n| p*n)
}

谢谢。您能够帮助我找到正确的特征来更正我的代码。