Generics 既然num::zero和one已被弃用,那么应该如何提供一个或零呢?

Generics 既然num::zero和one已被弃用,那么应该如何提供一个或零呢?,generics,types,numbers,rust,Generics,Types,Numbers,Rust,在编写自己的通用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)) } fn-sigma

在编写自己的通用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))
}
fn-sigma(iter:I,func:F)->T
其中I:Iterator,
T:加上,
F:Fn(T)->T
{
iter折叠(0,| acc,x | acc+func(x))
}

我理解这是错误的,因为0是一个具体类型,因此不是
T
。其他答案(如和)依赖于从1.11开始的结构,如
Int::zero

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


我的Rust版本是1.16。

询问您的功能应该如何完成可能会成为基于意见的:有多种好方法可以实现这一点。然而,如果我们把这两种方法狭义地考虑,我会认为这是典型的和惯用的:< /P>
标准库中的
Zero
One
被弃用(事实上从未稳定过!),这主要是因为有一种更通用的方法可以从迭代器中生成乘积和和:迭代器在调用方法和时依赖和特性,甚至可以生成除items之外的类型的结果

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>()
}

询问您的功能应该如何完成可能会成为基于意见的:有多种好方法可以实现这一点。然而,如果我们把这两种方法狭义地考虑,我会认为这是典型的和惯用的:< /P>
标准库中的
Zero
One
被弃用(事实上从未稳定过!),这主要是因为有一种更通用的方法可以从迭代器中生成乘积和和:迭代器在调用方法和时依赖和特性,甚至可以生成除items之外的类型的结果

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>()
}

非常强调标准库
Zero
One
从未稳定,一直建议使用
num
板条箱。使用更好(依赖性更少),除非您想要
num
提供的一切(大整数、复杂、有理等)。谢谢;很明显,我需要不断努力让自己的性格特征下降。既然我有你在这里:我假设
.map.sum
将导致对列表进行两次迭代,其中as
fold
只使用一次遍历?实际上,
map
将生成一个新的惰性迭代器,它包装原始迭代器而不立即使用它。它更像Java的流映射,而不像JavaScript的map.Cool。我将为未来的人们添加:原因是
.map
创建了一个
map::Iterator
,它的
.next()
惰性地从它所包装的迭代器中计算下一个值,如std lib源代码所示(搜索
fn next
)强烈强调标准库
Zero
One
从未稳定,一直建议使用
num
板条箱。使用更好(依赖性更少),除非您需要
num
提供的一切(大整数、复杂、有理等)。谢谢;很明显,我需要不断努力让自己的性格特征下降。既然我有你在这里:我假设
.map.sum
将导致对列表进行两次迭代,其中as
fold
只使用一次遍历?实际上,
map
将生成一个新的惰性迭代器,它包装原始迭代器而不立即使用它。它更像Java的流映射,而不像JavaScript的map.Cool。我将为未来的人们添加:原因是
.map
创建了一个
map::Iterator
,它的
.next()
从它包装的迭代器中懒洋洋地计算下一个值,如std lib源代码中所示(搜索
fn next
)。感谢您链接这些问题;我已经适当地更新了它们。很好的重写。感谢您随机回答网民的问题。感谢您链接这些问题;我已经适当地更新了它们。很好的重写。感谢您随机回答网民的问题。