以下代码片段来自: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.fold
我知道泛型类型F是一个可调用的,它实现FnMut并接受两个参数:B和Self::Item,这是迭代器迭代的项目,该可调用的返回类型是B。我的问题是关于 的B类型。没有指定,也没有描述任何约束。我是否可以理解它可以是任何类型?
fn fold<B, F>(self, init: B, f: F) -> B
where
Self: Sized,
F: FnMut(B, Self::Item) -> B,
Run Code Online (Sandbox Code Playgroud)
是的,你是对的。只要您给出的类型init: B与您传递给的类型一致,f: F那么B这里就不受其他限制(除了隐式Sized要求)。
我所说的“与”一致,只是指BinFnMut(B, Self::Item) -> B与您传递的任何内容的类型相同init。
例如
fn unsigned_adder(a: u32, b: u32) -> u32 {
a + b
}
some_u32_iterator.fold(0_i32, unsigned_adder);
Run Code Online (Sandbox Code Playgroud)
不一致,因为该函数期望B为 a u32,但您给出了i32as init。改成
some_u32_iterator.fold(0_u32, unsigned_adder);
Run Code Online (Sandbox Code Playgroud)
这是一致的。
(注意,在现实世界中,如果您没有在 int 文字上添加类型后缀,则类型推断会在这个示例中解决您的问题,但这只是为了说明这一点)
| 归档时间: |
|
| 查看次数: |
83 次 |
| 最近记录: |