【发布时间】:2019-09-29 20:14:11
【问题描述】:
我想要一个函数,它接受&IntoIterator<Item=u32>,所以我可以将&Vec<u32> 和迭代器的适配器结构(如Map、Filter 和任何其他的,我相信它们都实现@ 987654325@)
所以我有一个类似的功能
pub fn f<'a, T>(it_src: &'a T) -> u32
where &'a T: IntoIterator<Item = u32> {
let it = it_src.into_iter();
let result: u32;
// more more usage
result
}
这就是我尝试使用它的方式(相同的签名,但不同的名称)
pub fn f_with_feature()<'a, T>(it_src: &'a T) -> u32
where &'a T: IntoIterator<Item = u32> {
let adjusted_values = it_src.into_iter()
.map(|e| adjust(e));
f(&adjusted_values)
}
我得到的是一个错误
error[E0308]: mismatched types
--> src\main.rs:14:7
|
14 | f(&adjusted_values)
| ^^^^^^^^^^^^^^^^ expected type parameter, found struct `std::iter::Map`
|
= note: expected type `&T`
found type `&std::iter::Map<<&T as std::iter::IntoIterator>::IntoIter, [closure@src\main.rs:13:14: 13:27]>`
Map 和 T 不匹配怎么办?
另外,我想出了一个想法,通过静态调度传递迭代器的适配器并不是一个好主意,因为用于生成 Map 的每个其他闭包都会创建一个新的函数特化。尽管我已经看到大多数时候静态调度方法在 Rust 中是惯用的。如何处理这种情况?
【问题讨论】: