我有一個產生斐波納契數字的迭代器。我將該類型限制爲u32
,但現在我正努力使其對於任何數字類型都是通用的。如何在實現特質的同時在類型上放置特徵約束?
工作,非通用代碼:
struct Fib {
value: u32,
next: u32,
}
impl Fib {
fn new(a : u32, b : u32) -> Fib {
Fib { value : a, next : b }
}
}
impl Iterator for Fib {
type Item = u32;
fn next(&mut self) -> Option<u32> {
let value = self.value;
let next = self.value + self.next;
self.value = self.next;
self.next = next;
Some(value)
}
}
//////////////////////////////////////////////////
fn main() {
let fib = Fib::new(1, 2);
let sum = fib.filter(|x| { x % 2 == 0 })
.take_while(|&x| { x <= 4000000 })
.fold(0, |sum, x| { sum + x });
println!("{}", sum);
}
的問題是,Iterator
的實現需要一個約束Num
,但我不知道該如何表達這一點:
impl <T : Num> Iterator for Fib<T> { ... }
產品:
use of undeclared trait name `Num`
而當我嘗試use std::num::{Num}
或use num::traits::{Num}
,我被告知這些模塊不存在。
呃... [那特質**不存在](http://doc.rust-lang.org/std/?search=Num)。錯誤信息在這裏很有用。 – Shepmaster
我在這裏找到它:https://doc.rust-lang.org/num/num/traits/trait.Num.html 如何判斷哪些文檔已過期? –
這是從編號,而不是從stdlib〜> https://crates.io/crates/num – contradictioned