gpt4 book ai didi

generics - 既然 num::Zero 和 One 已被弃用,应该如何提供 1 或 0?

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

在编写我自己的通用 sigma 求和函数以练习 Rust 时,我遇到了一个问题,即提供零种子值作为累加器。

fn sigma<I, T, F>(iter: I, func: F) -> T
where I: Iterator<Item=T>,
T: Add<Output=T>,
F: Fn(T) -> T
{
iter.fold(0, |acc, x| acc + func(x))
}

Playground Link

我知道这是错误的,因为 0 是具体类型,因此不是 T。其他答案(如 thisthis one )依赖于像 Int::zero 这样的结构,即 deprecated从 1.11 开始。

还有其他方法可以做到这一点,但我对应该如何完成特别感兴趣,因为测试 1、0 或否定性是数值过程中的常见操作,我将很快再次击中。另外,现在我很好奇。

我的 Rust 版本是 1.16。

最佳答案

询问您的功能应该如何完成可以成为基于意见的:有多种实现此目的的好方法。然而,如果我们缩小到这两种方法,我认为这是典型的和惯用的,这是可以回答的:


ZeroOne 已从标准库中弃用(事实上,甚至从未稳定过!)主要是因为有一种更通用的方法可以从迭代器生成乘积和求和: SumProduct迭代器在调用方法时依赖特征 sum()product() ,甚至可以产生不同于项目类型的结果。

use std::iter::{Iterator, Sum};

fn sigma<I, T, F>(iter: I, func: F) -> T
where I: Iterator<Item = T>,
T: Sum,
F: Fn(T) -> T
{

iter.map(func).sum::<T>()
}

Playground .我冒昧地将元素转换移动到迭代器定义链中的 map,从而可以将 sum() 用作终端操作。


性状 ZeroOne在 crate num(或 num-traits)中仍然可用,因此您可以改用它。

extern crate num;

use std::ops::Add;
use std::iter::Iterator;
use num::Zero;

fn sigma<I, T, F>(iter: I, func: F) -> T
where I: Iterator<Item = T>,
T: Zero + Add<Output = T>,
F: Fn(T) -> T
{
iter.map(func).fold(T::zero(), |a, b| a + b)
}

Playground

关于generics - 既然 num::Zero 和 One 已被弃用,应该如何提供 1 或 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43700398/

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