我希望有一个函数,可以接受
因此,我需要编写如下的函数:
这是我尝试使用它的方法(相同的签名,但不同的名称)
&IntoIterator<Item=u32>
类型的参数,这样我就可以将&Vec<u32>
和迭代器适配器结构体(例如Map
、Filter
以及其他所有实现了IntoIterator
接口的结构体)传递给它。因此,我需要编写如下的函数:
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中,大多数情况下采用静态分派方法是成语的。如何处理这种情况?
iter()
也不会消耗或复制向量。 - Pr0methean