gpt4 book ai didi

generics - 如何以通用方式定义向量(或迭代器)的总和?

转载 作者:行者123 更新时间:2023-11-29 07:50:01 25 4
gpt4 key购买 nike

我有以下 sum i32 向量的函数编译并工作正常:

fn sum_vec(s: &Vec<i64>, init: &i64) -> i64 {
(*s).iter().fold(*init, |acc, &item| acc + item)
}

为了自学 Rust 泛型,我想为任何类型定义相应的泛型函数 T实现了 add(T, T) -> T 形式的添加.我试过了

use std::ops::Add;

fn sum_gen_1<T: Add>(s: &Vec<T>, init: &T) -> T {
(*s).iter().fold(*init, |acc, &item| acc + item)
}

但是我得到以下错误

error[E0308]: mismatched types
--> src/lib.rs:4:42
|
4 | (*s).iter().fold(*init, |acc, &item| acc + item)
| ^^^^^^^^^^ expected type parameter, found associated type
|
= note: expected type `T`
found type `<T as std::ops::Add>::Output`

看来还得进一步约束 Add特征使得类型 Add::Output等于 T .根据在 interwebz 上找到的一些文档(可能是针对旧版本的 Rust),我尝试将类型约束更改为 T: Add<T, T> ,即将泛型函数声明为:

fn sum_gen_1<T: Add<T, T>>(s: &Vec<T>, init: &T) -> T

和之前一样的函数体。这次报错了

error[E0107]: wrong number of type arguments: expected at most 1, found 2
--> src/lib.rs:3:17
|
3 | fn sum_gen_1<T: Add<T, T>>(s: &Vec<T>, init: &T) -> T {
| ^^^^^^^^^ expected at most 1 type argument

完成此任务的正确方法是什么?我应该使用不同的特征而不是 Add 吗? ?也许定义我自己的特征并为我想要的类型实现它 sum工作?

我注意到这是一个特征 std::iter::AdditiveIterator 这似乎使我的实现变得不必要。但是,它被标记为不稳定,任何尝试使用它都会在使用 rustc-1.0.0-beta 时导致编译错误。

最佳答案

你几乎明白了。关联类型必须由名称/关键字给出,因此您正在寻找 Add<T, Output = T> .

随着这种变化,您面临着随意复制数字的问题,但没有 Copy边界。我建议采用以下实现方式:

fn sum_vec<T>(s: &[T], init: &T) -> T
where
T: Copy + Add<T, Output = T>,
{
s.iter().fold(*init, |acc, &item| acc + item)
}

改变 &Vec<T>&[T]没有任何影响,但它使功能更通用并且没有任何损失。

另见:

关于generics - 如何以通用方式定义向量(或迭代器)的总和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29459738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com