我有一個Fibonacci可以被用作迭代的任何實現(xiàn)結(jié)構(gòu)One,Zero,Add和Clone。這適用于所有整數(shù)類型。我想將此結(jié)構(gòu)用于BigInteger使用a實現(xiàn)的類型,Vec并且調(diào)用clone()起來很昂貴。我想Add在兩個引用上使用T它們,然后返回一個新的T(不進(jìn)行克隆)。為了我的一生,我無法做出可以編譯的...工作方式:extern crate num;use std::ops::Add;use std::mem;use num::traits::{One, Zero};pub struct Fibonacci<T> { curr: T, next: T,}pub fn new<T: One + Zero>() -> Fibonacci<T> { Fibonacci { curr: T::zero(), next: T::one(), }}impl<'a, T: Clone + Add<T, Output = T>> Iterator for Fibonacci<T> { type Item = T; fn next(&mut self) -> Option<T> { mem::swap(&mut self.next, &mut self.curr); self.next = self.next.clone() + self.curr.clone(); Some(self.curr.clone()) }}#[test]fn test_fibonacci() { let first_12 = new::<i64>().take(12).collect::<Vec<_>>(); assert_eq!(vec![1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144], first_12);}期望的:extern crate num;use std::ops::Add;use std::mem;use num::traits::{One, Zero};pub struct Fibonacci<T> { curr: T, next: T,}pub fn new<T: One + Zero>() -> Fibonacci<T> { Fibonacci { curr: T::zero(), next: T::one(), }}impl<'a, T: Clone + 'a> Iterator for Fibonacci<T>where &'a T: Add<&'a T, Output = T>,{ type Item = T; fn next(&mut self) -> Option<T> { mem::swap(&mut self.next, &mut self.curr); self.next = &self.next + &self.curr; Some(self.curr.clone()) }}#[test]fn test_fibonacci() { let first_12 = new::<i64>().take(12).collect::<Vec<_>>(); assert_eq!(vec![1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144], first_12);}
2 回答

一只萌萌小番薯
TA貢獻(xiàn)1795條經(jīng)驗 獲得超7個贊
我的想法是創(chuàng)建一個狀態(tài)struct
來保存該狀態(tài),然后創(chuàng)建另一個Iterator struct
引用第一個(&mut
)并在其“高級”時對其進(jìn)行變異,以便Iterator可以將引用返回給該State;但我無法調(diào)整借位。
- 2 回答
- 0 關(guān)注
- 583 瀏覽
添加回答
舉報
0/150
提交
取消