Rust 使用引用指定通用的AddAssign

Rust 使用引用指定通用的AddAssign,rust,traits,Rust,Traits,不久前,我考虑为斐波那契序列编写一个通用迭代器 可以接受基本数字和自定义类型(例如 bignums)。未能获得同时适用于这两种基元类型的版本后 而bignums,我偶然发现了这个问题: 它使用了所谓的高等级特征边界来解决这个问题 具体问题 然而,现在我正尝试使用类似的策略来使用*\u assign 而不是操作员。特别是,我正试图得到类似的东西 工作: 我可以创建一个宏,为这些操作符创建实际引用基元类型的实现,但这似乎有点浪费。还有其他方法可以达到同样的效果吗?只是代码中的一个小疏忽。让我们来看

不久前,我考虑为斐波那契序列编写一个通用迭代器 可以接受基本数字和自定义类型(例如
bignums
)。未能获得同时适用于这两种基元类型的版本后 而
bignums
,我偶然发现了这个问题:

它使用了所谓的高等级特征边界来解决这个问题 具体问题

然而,现在我正尝试使用类似的策略来使用
*\u assign
而不是操作员。特别是,我正试图得到类似的东西 工作:


我可以创建一个宏,为这些操作符创建实际引用基元类型的实现,但这似乎有点浪费。还有其他方法可以达到同样的效果吗?

只是代码中的一个小疏忽。让我们来看看这个特点:

pub trait AddAssign<Rhs = Self> {
    fn add_assign(&mut self, rhs: Rhs);
}
。。。你会写:

where for <'b> T: AddAssign<&'b T>,
where for,
(到目前为止,没有其他行更改)


但是,您注意到代码:

错误[E0277]:绑定为的特征不满足
-->src/main.rs:13:38
|
13 | println!(“add_assign_test()={}”,add_assign_test(&mut2,&2));
|^^^^^^^^^^^^^^^^^^^^ `{integer}+=&'b{integer}没有实现`
|
=帮助:`{integer}未实现特性`for``
=注:“添加\分配\测试”要求`
原因很简单:对于将不可变引用作为rhs()的基元类型,根本没有实现
AddAssign
。我不知道这是否是一个疏忽——值得在Rust回购协议上公开一个问题


为了验证上述代码是否有效,我编写了自己的类型,并适当地实现了
AddAssign根据Lukas的回复更正了代码片段:

use std::ops::{Add, AddAssign};

fn add_test<'a, T>(x: &'a T, y: &'a T) -> T
where
    for<'b> &'b T: Add<Output = T>,
{
    x + y
}

fn add_assign_test<'a, T>(x: &'a mut T, y: &'a T) -> T
where
    for<'b> T: AddAssign<&'b T>,
    T: Clone,
{
    *x += y;
    x.clone()
}

fn main() {
    println!("add_test()={}", add_test(&1, &2));
    println!("add_assign_test()={}", add_assign_test(&mut 2, &2));
}
使用std::ops:{Add,AddAssign};
fn添加测试和'b T:add,
{
x+y
}

fn add_assign_test T:addassign嗯,这几乎是我不想听的:(看看锈迹斑斑的回购票据,我想这是同一个问题:对吧?看看这些变化,现在似乎这实际上已经得到了解决。只是我在重温时注意到的一件小事:为什么我需要取消对左侧
x
的引用?
where for <'b> T: AddAssign<&'b T>,
use std::ops::{Add, AddAssign};

fn add_test<'a, T>(x: &'a T, y: &'a T) -> T
where
    for<'b> &'b T: Add<Output = T>,
{
    x + y
}

fn add_assign_test<'a, T>(x: &'a mut T, y: &'a T) -> T
where
    for<'b> T: AddAssign<&'b T>,
    T: Clone,
{
    *x += y;
    x.clone()
}

fn main() {
    println!("add_test()={}", add_test(&1, &2));
    println!("add_assign_test()={}", add_assign_test(&mut 2, &2));
}