在Rust中实现一个通用的计算算法是相当麻烦的。感觉就像我正在重塑所有不在算法中的东西,而是在教会数字的共同域中。在Rust中实现泛型计算算法的正确方法是什么?
例如,下面的拉斯特1.7作品factorial
实现:
#![feature(zero_one)]
use std::num::{One, Zero};
use std::ops::{Sub, Mul};
use std::cmp::Eq;
fn fact<T>(n: T) -> T
where T: Clone + Eq + Zero + One + Mul<T, Output = T> + Sub<T, Output = T>
{
if n == T::zero() {
T::one()
} else {
fact(n.clone() - T::one()) * n
}
}
fn main() {
println!("{}", fact(10));
}
是否有这样做的任何正确的方式?有没有讨论过它呢?
大概factorial
不是很好的例子,让我们尝试is_even
:
fn is_even<T>(x: T) -> bool
where T: std::ops::Rem<Output = T> + std::ops::Add<T, Output=T> + std::num::One + std::num::Zero + std::cmp::PartialEq
{
let two = T::one() + T::one();
(x % two) == T::zero()
}
如果你想有一个two
的东西,你必须重新实现两项。
这似乎并不像Stack Overflow可以回答的狭隘目标问题。 “我如何实现一个通用算法”是一个非常广泛的话题。正如我写的,你的代码看起来像我期望的阶乘的定义。 *对我来说,你的问题更多的是咆哮而不是一个善意的问题,但这可能只是我个人的解释。 – Shepmaster
@Shepmaster如果发现'factorial',那么这个'is_even'怎么样? – Adam
您可以通过使用[num crate](https://github.com/rust-num/num)中的特征来减少边界,但实现将保持不变。您如何期望is_even的通用实现看起来理想? –