关于Rust Iterator trait中fold函数泛型B的类型疑问
关于Rust Iterator::fold中泛型B的类型疑问解答
是的,B可以是任意类型,它的具体类型完全由你传入的init参数的类型决定,唯一的限制来自闭包f:闭包必须能接收B类型的累计值和迭代器的元素类型,并且返回B类型的值。
举几个实际例子就能明白:
- 用
fold计算数值总和,B就是数值类型(比如i32):
let sum = (1..5).fold(0, |acc, x| acc + x); // 传入的init是0(i32类型),因此B被推导为i32
- 用
fold将迭代元素收集为向量,B就是Vec<T>:
let vec = (1..5).fold(Vec::new(), |mut acc, x| { acc.push(x); acc }); // init是Vec::new(),所以B被推导为Vec<i32>
- 甚至可以使用自定义结构体作为
B,只要闭包能正确处理该类型:
struct Counter { count: u32 } let counter = (1..5).fold(Counter { count: 0 }, |mut acc, _| { acc.count += 1; acc }); // 这里B就是自定义的Counter类型
简单来说,B没有额外的约束条件,只要你能提供一个B类型的初始值init,并且闭包f符合FnMut(B, Self::Item) -> B的签名要求,任何类型都可以作为B来使用。
内容的提问来源于stack exchange,提问作者Deborah C
相关产品推荐
相关产品推荐

