作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在编写我自己的通用 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))
}
我知道这是错误的,因为 0 是具体类型,因此不是 T
。其他答案(如 this 和 this one )依赖于像 Int::zero
这样的结构,即 deprecated从 1.11 开始。
还有其他方法可以做到这一点,但我对应该如何完成特别感兴趣,因为测试 1、0 或否定性是数值过程中的常见操作,我将很快再次击中。另外,现在我很好奇。
我的 Rust 版本是 1.16。
最佳答案
询问您的功能应该如何完成可以成为基于意见的:有多种实现此目的的好方法。然而,如果我们缩小到这两种方法,我认为这是典型的和惯用的,这是可以回答的:
Zero
和 One
已从标准库中弃用(事实上,甚至从未稳定过!)主要是因为有一种更通用的方法可以从迭代器生成乘积和求和: Sum
和 Product
迭代器在调用方法时依赖特征 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()
用作终端操作。
性状 Zero
和 One
在 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)
}
关于generics - 既然 num::Zero 和 One 已被弃用,应该如何提供 1 或 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43700398/
我是一名优秀的程序员,十分优秀!