在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的通用實現看起來理想? –