为了账号安全,请及时绑定邮箱和手机立即绑定

如何编写一个特征绑定以添加两个泛型类型的引用?

如何编写一个特征绑定以添加两个泛型类型的引用?

Git
aluckdog 2019-11-20 14:55:42
我有一个Fibonacci可以被用作迭代的任何实现结构One,Zero,Add和Clone。这适用于所有整数类型。我想将此结构用于BigInteger使用a实现的类型,Vec并且调用clone()起来很昂贵。我想Add在两个引用上使用T它们,然后返回一个新的T(不进行克隆)。为了我的一生,我无法做出可以编译的...工作方式: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贡献1795条经验 获得超7个赞

我的想法是创建一个状态struct来保存该状态,然后创建另一个Iterator struct引用第一个(&mut)并在其“高级”时对其进行变异,以便Iterator可以将引用返回给该State;但我无法调整借位。

查看完整回答
反对 回复 2019-11-20
  • 2 回答
  • 0 关注
  • 552 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信